AtCoder Beginner Contest 189 解题报告

题目链接:https://atcoder.jp/contests/abc189/tasks

A - Slot

题目大意

输入一个串,只包含三个字符,如果都相同,输出“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 - Alcoholic

题目大意

喝酒。有n瓶酒,每瓶酒ai毫升,酒精浓度时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 - Mandarin Orange

题目大意

n个数,操作(l, r, x)表示区间[l, r]里面的数,满足每个数都大于等于x,代表的值s = x * (r - l + 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 - Logical Expression

题目大意

给你n个字符串,要么是"AND",要么是"OR",分别代表位运算中的与运算和或运算,然后让你构造长度为n+1的仅包含"False"和"True"的序列,使得带入n个字符串组成的运算式最终结果是True,问你这样的序列有几个。

比如样例的2个串"AND","OR",那么构造的序列可以是{True, False, True},因为 True & False | True = True。这样的序列有5个,则输出5

思路

有点像dp的递推式,假设从第1个位置到第i-1个位置做运算之后结果是True的数量为a1初始化是1,结果是False的数量为a2初始化是1。

如果第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
今日推荐