Atcoder Beginner Contest 124 解题报告

Posted mrzdtz220

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
", 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
", 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
", 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
", ans);
    return 0;
}
View Code

 

下次再也不多开比赛了。

 

以上是关于Atcoder Beginner Contest 124 解题报告的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242