Atcoder Beginner Contest 124 解题报告

心态爆炸。本来能全做出来的。但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了。

回来写了一会D就过了。可惜比赛已经结束了。真的是作死。

A - Buttons

#include <cstdio>
using namespace std;

int main() {
    int x, y;
    scanf("%d%d", &x, &y);
    int ans = x > y ? x : y;
    if (x > y) x--;
    else y--;
    if (x > y) ans += x;
    else ans += y;
    printf("%d", ans);
    return 0;
}
View Code

B - Great Ocean View

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 25;
int a[maxn];

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    int ans = 0;
    for (int i = 0; i < n; i++) {
        bool flag = false;
        for (int j = i - 1; j >= 0; j--) {
            if (a[i] < a[j]) {
                flag = true;
                break;
            }
        }
        if (!flag) ans++;
    }
    printf("%d\n", ans);
    return 0;
}
View Code


C - Coloring Colorfully

只有两种排列方式 第一种为0或者第一种为1

跑两遍取最小就好了

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
char s[maxn];

int main() {
    scanf("%s", s);
    int len = strlen(s);
    if (len == 1) {
        puts("0");
        return 0;
    }  
    int now = 0;
    int ans = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] - '0' != now) ans++;
        now ^= 1;
    } 
    int temp = 0;
    now = 1;
    for (int i = 0; i < len; i++) {
        if (s[i] - '0' != now) temp++;
        now ^= 1;
    }
    printf("%d\n", min(ans, temp));
    return 0;
}
View Code

D - Handstand

题意是一个长为N的01串,可以至多操作K次,每次操作任选一个区间都变成另一个颜色

求最长连续1的长度

问题就等价于有x个连续1的区间(遍历统计一下)把 k+1 个区间并起来有多长(中间的0也得统计上)

区间用结构体存上l,r 统计答案就是G[i+k].r - G[i].l + 1

有多种情况要考虑

一是 0000000000001010101010101000000 这样统计答案的时候

我们会忽略掉这些前导0和后导0 因为我们是从G[0].l开始统计的 所以不是正解

解决方案就是 G数组给加上头和尾 G{0].l = G[0].r = 0 G[x].l = G[x].r = len-1

遍历统计答案的时候就会把这些前导0后导0给算上

二是 000000000000000100000001000000000  k = 500 的情况

这是特殊情况 如果连续1的区间没有k + 1大的话 答案就是len了

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
char s[maxn];
struct Point {
    int l, r;
} G[maxn];

int main() {
    int len, k;
    scanf("%d%d", &len, &k);
    scanf("%s", s);
    int l = 0;
    int cnt = 0;
    s[len] = '0';
    G[0].l = G[0].r = 0;
    cnt = 1;
    for (int i = 0; i <= len; i++) {
        if (s[i] == '1') {
            if (!l) G[cnt++].l = i;
            l++;  
        } else {
            if (l) G[cnt-1].r = i - 1;
            l = 0;
        }   
    }
    G[cnt].l = G[cnt].r = len - 1;
    cnt++;
    int ans = 0;
    if (k + 1 >= cnt) {
        printf("%d\n", len);
        return 0;
    }
    for (int i = 0; i < cnt; i++) {
        int temp = i + k;
        if (temp >= cnt) break;
        ans = max(ans, G[temp].r - G[i].l + 1);
    }
    ans = min(ans, len);
    printf("%d\n", ans);
    return 0;
}
View Code

下次再也不多开比赛了。

猜你喜欢

转载自www.cnblogs.com/Mrzdtz220/p/10703719.html
今日推荐