タイトルリンク:https://atcoder.jp/contests/abc189/tasks
A-スロット
トピック
3文字のみを含む文字列を入力し、すべて同じ場合は「Won」を出力し、そうでない場合は「Lost」を出力します。
アイデア
水問題。
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
string a; cin >> a;
if(a[0] == a[1] && a[0] == a[2]) puts("Won");
else puts("Lost");
return 0;
}
B-アルコール依存症
トピック
ドリンク。ワインはn本あり、それぞれが狙いを定めており、アルコール度数がbi、高橋のアルコール度数がmの場合、順番に飲まなければならず、飲んだらどのボトルを飲むかを聞いてきます。アルコールが終了し、飲酒されていない場合(彼の胃はすべてを保持するのに十分な大きさです!)、-1が出力されます。
アイデア
シミュレーション。ボトルレスワインのアルコール含有量ai * biを計算し、アルコール含有量がm * 100を超えるまで順番に飲みます。
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int a[maxn];
int main(){
int n, m;
cin >> n >> m;
m *= 100;
for(int i = 1; i <= n; i ++){
int x, y;
cin >> x >> y;
a[i] = x * y;
}
int ans = -1, id = 1;
while(id <= n){
m -= a[id];
ans = id ++;
if(m < 0) break;
}
if(m >= 0) ans = -1;
cout << ans << endl;
return 0;
}
C-みかん
トピック
n個の数値の場合、演算(l、r、x)は区間[l、r]内の数値を表し、各数値はx以上であり、値はs = x *(rl + 1)で表されます。条件が満たされているsの最大値
アイデア
暴力。位置ごとに、境界値がこの値より小さくなるまで数値が左右に分散され、その後、最大値が更新されます。
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e4 + 5;
int a[maxn];
int main(){
int n; cin >> n;
for(int i = 1; i <= n; i ++){
cin >> a[i];
}
int ans = 0;
for(int i = 1; i <= n; i ++){
int id = i + 1, l = i, r = i; //l,r分别代表扩展左右边界
while(id <= n && a[i] <= a[id]){
r = id ++;
}
id = i - 1;
while(id >= 1 && a[i] <= a[id]) {
l = id --;
}
ans = max(ans, a[i] * (r - l + 1)); //(l, r, x) 这里的a[i]就作为x, 区间长度是r - l + 1,所以代表的值就是a[i] * (r - l + 1)
}
cout << ans << endl;
return 0;
}
D-論理式
トピック
ビット演算のAND演算とOR演算をそれぞれ表す「AND」または「OR」のn個の文字列を指定し、「False」と「True」のみを含む長さn +1を作成します。 n個の文字列で構成される式の最終結果を作成するシーケンスはTrueです。そのようなシーケンスがいくつあるかを尋ねます。
たとえば、サンプルの2つの文字列 "AND"、 "OR"の場合、True&False | True = Trueであるため、構築されたシーケンスは{True、False、True}になります。そのようなシーケンスは5つあり、出力5
アイデア
これは、dpの再帰式に少し似ています。最初の位置からi-1番目の位置までの演算後のTrueの数がa1であり、1に初期化され、Falseの数がa2に初期化されるとします。
i番目の位置の演算がANDの場合、演算の結果がTrueの場合、1&1のみ、つまりi番目の位置の演算結果の数がTrueの場合はa1になります。それ以外の場合は、a1になります。演算結果がFalseの場合、1&0、0&1,0&0になる可能性があります。つまり、i番目の位置までのFalse結果の数はa1 + a2 + a2です。
同様に、i番目の位置での演算がORであり、演算の結果がTrueの場合、1 | 1、1 | 0、0 | 1になる可能性があります。これは、演算の数を意味します。 i番目の位置での結果がTrueの場合はa1 + a1 + a2です。それ以外の場合、演算結果がFalseの場合、0 | 0のみになります。つまり、i番目の位置でのFalse演算の結果の数は次のようになります。 a2。
最終結果は再帰的なa1です。
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e4 + 5;
string a[66];
int main(){
ll ans = 0;
int n; cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
ll a1 = 1, a2 = 1, t1, t2;
for(int i = 1; i <= n; i ++){
if(a[i] == "OR"){
t1 = a1 * 2 + a2;
t2 = a2;
}else{
t1 = a1;
t2 = a1 + a2 * 2;
}
a1 = t1, a2 = t2;
}
cout << a1 << endl;
return 0;
}