Link do título: https://atcoder.jp/contests/abc189/tasks
A - Slot
Tópico
Insira uma string contendo apenas três caracteres, se forem todos iguais, imprima "Won", caso contrário, imprima "Lost"
Ideias
Problema de água.
código 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 - Álcool
Tópico
bebida. Existem n garrafas de vinho, cada garrafa é pontual, quando a concentração de álcool é bi, o volume de álcool de Takahashi é m, e então ele tem que beber na ordem, e perguntar a você qual garrafa ele vai beber quando beber, se todos os o álcool acabou e ele não está bêbado (seu estômago é grande o suficiente para conter tudo!), então -1 é a saída.
Ideias
simulação. Calcule o teor de álcool ai * bi do vinho sem garrafa e beba sequencialmente até que o teor de álcool exceda m * 100.
código 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 - laranja mandarim
Tópico
n números, a operação (l, r, x) representa os números no intervalo [l, r], e cada número é maior ou igual ax, o valor representado por s = x * (rl + 1), e as condições são satisfeitas O valor máximo de s
Ideias
violência. Para cada posição, o número é espalhado para a esquerda e para a direita até que o valor limite seja menor que esse valor e, então, o valor máximo é atualizado.
código 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 - Expressão Lógica
Tópico
Fornece n strings, "AND" ou "OR", que representam respectivamente a operação AND e a operação OR na operação de bit e, em seguida, permite construir um comprimento de n + 1 que contém apenas "False" e "True" A sequência que torna o resultado final da expressão que consiste em n strings é True. Pergunte quantas dessas sequências existem.
Por exemplo, as duas strings "AND", "OR" da amostra, então a sequência construída pode ser {True, False, True}, porque True & False | True = True. Existem 5 dessas sequências, então a saída 5
Ideias
É um pouco como a fórmula recursiva de dp. Suponha que o número de True após a operação da primeira posição para a i-1ª posição seja a1, que é inicializado com 1, e o número de False é inicializado com a2.
Se a operação da i-ésima posição for AND, então se o resultado da operação for Verdadeiro, então apenas 1 & 1, ou seja, o número dos resultados da operação da i-ésima posição é Verdadeiro é a1; caso contrário, se o resultado da operação for False, então pode ser 1 & 0, 0 & 1,0 & 0, ou seja, o número de resultados falsos para a i-ésima posição é a1 + a2 + a2.
Da mesma forma, se a operação na i-ésima posição for OR, e o resultado da operação for True, então pode ser 1 | 1, 1 | 0, 0 | 1, o que significa que o número da operação resultados na i-ésima posição são Verdadeiros é a1 + a1 + a2; Caso contrário, se o resultado da operação for Falso, então ele só pode ser 0 | 0, o que significa que o número de resultados falsos da operação para a i-ésima posição é a2.
O resultado final é o a1 recursivo.
código 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;
}