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?
下次再也不多開比賽了。
?
轉載于:https://www.cnblogs.com/Mrzdtz220/p/10703719.html
總結
以上是生活随笔為你收集整理的Atcoder Beginner Contest 124 解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CUBA Platform 7.0.4
- 下一篇: MySQL 不落地迁移、导入 Postg