AtCoder-Anfängerwettbewerb 189 Bericht zur Problemlösung

Titellink: https://atcoder.jp/contests/abc189/tasks

Ein Schlitz

Thema

Geben Sie eine Zeichenfolge mit nur drei Zeichen ein. Wenn alle Zeichen gleich sind, geben Sie "Won" aus, andernfalls "Lost".

Ideen

Wasserproblem.

AC-Code

#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 - Alkoholiker

Thema

trinken. Es gibt n Flaschen Wein, jede Flasche ist zielgerichtet, wenn die Alkoholkonzentration bi ist, Takahashis Alkoholvolumen m ist, und dann muss er in der richtigen Reihenfolge trinken und Sie fragen, welche Flasche er trinken wird, wenn er trinkt, wenn alle Alkohol ist aufgebraucht und er ist nicht betrunken (sein Magen ist groß genug, um alles aufzunehmen!), dann wird -1 ausgegeben.

Ideen

Simulation. Berechnen Sie den Alkoholgehalt ai * bi des flaschenlosen Weins und trinken Sie dann nacheinander, bis der Alkoholgehalt m * 100 überschreitet.

AC-Code

#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 - Mandarine

Thema

Bei n Zahlen repräsentiert die Operation (l, r, x) die Zahlen im Intervall [l, r], und jede Zahl ist größer oder gleich x, der Wert, der durch s = x * (rl + 1) dargestellt wird, und die Bedingungen sind erfüllt Der Maximalwert von s

Ideen

Gewalt. Für jede Position wird die Zahl nach links und rechts verteilt, bis der Grenzwert unter diesem Wert liegt, und dann wird der Maximalwert aktualisiert.

AC-Code

#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 - Logischer Ausdruck

Thema

Geben Sie n Zeichenfolgen an, entweder "AND" oder "OR", die jeweils die AND-Operation und die OR-Operation in der Bitoperation darstellen, und lassen Sie dann eine Länge von n + 1 konstruieren, die nur "False" und "True" enthält. Die Sequenz, aus der das Endergebnis des Ausdrucks besteht, der aus n Zeichenfolgen besteht, ist True. Fragen Sie, wie viele solcher Sequenzen vorhanden sind.

Beispiel: Die beiden Zeichenfolgen "AND", "OR" des Samples, dann kann die konstruierte Sequenz {True, False, True} sein, da True & False | True = True. Es gibt 5 solcher Sequenzen, dann wird 5 ausgegeben

Ideen

Es ist ein bisschen wie die rekursive Formel von dp. Angenommen, die Anzahl von True nach der Operation von der ersten Position zur i-1-ten Position ist a1, die auf 1 initialisiert wird, und die Anzahl von False wird auf a2 initialisiert.

Wenn die Operation der i-ten Position UND ist, dann ist, wenn das Ergebnis der Operation wahr ist, dann nur 1 & 1, dh die Anzahl der Operationsergebnisse der i-ten Position ist wahr, a1, andernfalls ist Wenn das Operationsergebnis False ist, kann es 1 & 0, 0 & 1,0 & 0 sein, dh die Anzahl der False-Ergebnisse an der i-ten Position ist a1 + a2 + a2.

Auf die gleiche Weise kann, wenn die Operation an der i-ten Position ODER ist und das Ergebnis der Operation wahr ist, 1 | 1, 1 | 0, 0 | 1 sein, was bedeutet, dass die Nummer der Operation Ergebnisse an der i-ten Position sind Wahr ist a1 + a1 + a2; andernfalls kann das Operationsergebnis, wenn es falsch ist, nur 0 | 0 sein, was bedeutet, dass die Anzahl der falschen Operationsergebnisse an der i-ten Position ist a2.

Das Endergebnis ist das rekursive a1.

AC-Code

#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;
}

Frage E ist auszufüllen. Obwohl sie während des Spiels offline verarbeitet wurde, war sie immer noch t.

Ich denke du magst

Origin blog.csdn.net/weixin_43911947/article/details/113063339
Empfohlen
Rangfolge