Отчет о решении проблем AtCoder Beginner Contest 189

Ссылка на заголовок: https://atcoder.jp/contests/abc189/tasks

Слот

Тема

Введите строку, содержащую всего три символа, если они все одинаковые, выведите «Выиграл», иначе выведите «Потерянный».

Идеи

Водная проблема.

код переменного тока

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

код переменного тока

#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

Идеи

насилие. Для каждой позиции число распространяется влево и вправо, пока граничное значение не станет меньше этого значения, а затем обновляется максимальное значение.

код переменного тока

#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 - Логическое выражение

Тема

Дайте вам n строк, либо «И», или «ИЛИ», которые соответственно представляют операцию И и операцию ИЛИ в битовой операции, а затем позвольте вам создать длину n + 1, которая содержит только «Ложь» и «Истина» Последовательность, которая делает окончательным результатом выражения, состоящего из n строк, является Истина. Спросите вас, сколько таких последовательностей существует.

Например, две строки «И», «ИЛИ» образца, тогда построенная последовательность может быть {Истина, Ложь, Истина}, потому что Истина и Ложь | Истина = Истина. Таких последовательностей 5, тогда выведите 5

Идеи

Это немного похоже на рекурсивную формулу dp. Предположим, что число True после операции от первой позиции до i-1-й позиции равно a1, которая инициализируется значением 1, а число False инициализируется как a2.

Если операция в i-й позиции - И, то если результат операции - Истина, то только 1 и 1, то есть количество результатов операции в i-й позиции - Истина равно a1; в противном случае если результатом операции является Ложь, то это может быть 1 & 0, 0 & 1,0 & 0, то есть количество Ложных результатов для i-й позиции равно a1 + a2 + a2.

Таким же образом, если операция в i-й позиции - ИЛИ, а результат операции - Истина, то это может быть 1 | 1, 1 | 0, 0 | 1, что означает, что номер операции результаты в i-й позиции True is a1 + a1 + a2; В противном случае, если результат операции равен False, тогда он может быть только 0 | 0, что означает, что количество результатов False в i-й позиции равно а2.

Конечный результат - рекурсивный a1.

код переменного тока

#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