AtCoderビギナーコンテスト189問題解決レポート

タイトルリンク: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;
}

質問Eは完了する予定です。ゲーム中にオフラインで処理されましたが、まだtでした。

おすすめ

転載: blog.csdn.net/weixin_43911947/article/details/113063339