Atcoder Beginner Contest 124 解题报告
Posted mrzdtz220
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Atcoder Beginner Contest 124 解题报告相关的知识,希望对你有一定的参考价值。
心态爆炸。本来能全做出来的。但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了。
回来写了一会D就过了。可惜比赛已经结束了。真的是作死。
#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; }
#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; }
只有两种排列方式 第一种为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; }
题意是一个长为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; }
下次再也不多开比赛了。
以上是关于Atcoder Beginner Contest 124 解题报告的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 115 题解