AtCoder 초급 콘테스트 189 문제 해결 보고서

제목 링크 : https://atcoder.jp/contests/abc189/tasks

A-슬롯

이야기

세 문자 만 포함 된 문자열을 입력합니다. 모두 같으면 "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 병의 와인이 있고, 각 병은 aiml이고, 알코올 농도가 bi 일 때, Takahashi의 알코올 양은 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입니다. 이러한 시퀀스가 ​​몇 개 있는지 물어보십시오.

예를 들어, 샘플의 두 문자열 "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이고, 그렇지 않으면 연산 결과가 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