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;
}

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;
}

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;
}

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;
}

下次再也不多开比赛了。

原文地址:https://www.cnblogs.com/Mrzdtz220/p/10703719.html

时间: 2024-08-30 12:48:39

Atcoder Beginner Contest 124 解题报告的相关文章

AtCoder Beginner Contest 117 解题报告

果然abc都是手速场. 倒序开的qwq. D题因为忘记1e12二进制几位上界爆了一发. A - Entrance Examination 就是除一下就行了... 看样例猜题意系列. #include<cstdio> #include<algorithm> #include<cstring> int main(){ double t,x; scanf("%lf%lf",&t,&x); printf("%lf",t/x

AtCoder Beginner Contest 120 解题报告

为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <queue> #include <cmath> #include <stack> #

AtCoder Beginner Contest 125 解题报告

那天晚上刚好有事就咕了. 最近的那一场E题还不会写.F题全场又只过了三个?留坑吧... A - Biscuit Generator #include <cstdio> using namespace std; inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (

AtCoder Beginner Contest 129 解题报告

传送门 写了四个题就跑去打球了.第五题应该能肝出来的. A - Airplane #include <bits/stdc++.h> using namespace std; inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' &

AtCoder Beginner Contest 132 解题报告

前四题都好水.后面两道题好难. C Divide the Problems #include <cstdio> #include <algorithm> using namespace std; inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (c

AtCoder Beginner Contest 124 D - Handstand(思维+前缀和)

D - Handstand Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement NN people are arranged in a row from left to right. You are given a string SS of length NN consisting of 0 and 1, and a positive integer KK. The ii-th per

【AtCoder】AtCoder Grand Contest 040 解题报告

点此进入比赛 \(A\):><(点此看题面) 大致题意: 给你一个长度为\(n-1\).由\(<\)和\(>\)组成的的字符串,第\(i\)位的字符表示第\(i\)个数和第\(i+1\)个数的大小关系,求这个由非负整数组成的数组中元素和的最小值. 送分题都想了几分钟才做出来,真是退役预警...... 显然,对于所有小于两旁的数,我们给它赋值为\(0\),然后再从它们向两边扩展即可. #include<bits/stdc++.h> #define Tp template&

AtCoder Beginner Contest 103 D(贪心)

AtCoder Beginner Contest 103 D 题目大意:n个点,除第n个点外第i与第i+1个点有一条边,给定m个a[i],b[i],求最少去掉几条边能使所有a[i],b[i]不相连. 按右端点从小到大排序,如果当前选的去掉的边在区间内,那么符合条件,否则ans++,并贪心地把去掉的边指向右端点,因为前面的区间都满足条件了,所以要去掉的边要尽量向右移使其满足更多的区间. 1 #include <iostream> 2 #include <cstdio> 3 #incl

AtCoder Beginner Contest 136

AtCoder Beginner Contest 136 Contest Duration : 2019-08-04(Sun) 20:00 ~ 2019-08-04(Sun) 21:40 Website: AtCoder BC-136 后面几题都挺考思考角度D. C - Build Stairs 题目描述: 有n座山从左到右排列,给定每一座山的高度\(Hi\),现在你可以对每座山进行如下操作至多一次:将这座山的高度降低1. 问是否有可能通过对一些山进行如上操作,使得最后从左至右,山的高度呈不下降