Hello2026
Posted at
# Codeforces
新年第一赛ABC做了, 记录一下
🏷️ Codeforces
A Binary Array Game
- 题目概述
给你一个数组, 这个数组里只有0和1
Alice和Bob可以执行两个操作之一, Alice先走
- 选择到删除并替换为一个数字
求谁会赢?(只剩下一个数字,如果是0 Alice赢, 如果是1 Bob赢
- 题目分析
只要有0, 替换后就为1
Alice想赢就得把数组变为全1
- 起始数组为11111111, 那么Alice赢
- 起始数组为1xxxxxxxx, 因为x中有0, 所有我们选择, 就变成了11 Alice赢
- 起始数组为xxxxxxxx1, 选择, 就变成了11 Alice赢
- 起始数组为0xxxxxxx0, Alice操作后肯定是0xxxxxxx, Bob直接选择 就变成了1 Bob赢
const int MAXN = 101;
int a[MAXN];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
if (a[1] || a[n]) cout << "Alice\n";
else cout << "Bob\n";
}
🏷️ Codeforces
B
- 题目概述
给你一个数组, 长度, 一个窗口长度为, 1
你每次选择最大的窗口并且在这个窗口里删除一个数
求最后只剩长度时, 最大的
- 题目分析
我们需要尽可能保护中的
答案为
const int MAXN = 2e5 + 1;
int a[MAXN];
void solve() {
int n, k; cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
sort(a + 1, a + 1 + n);
int e = unique(a + 1, a + 1 + n) - a - 1;
int ans = e;
for (int i = 1; i <= e; ++i) {
if (i - 1 != a[i]) {
ans = i - 1;
break;
}
}
ans = min(k - 1, ans);
cout << ans << endl;
🏷️ Codeforces
C War Strategy
- 题目概述
给n,m,k
n代表数组长度, m代表限制天数, k代表起始大本营
每天可以执行操作
- a_i的士兵部分或全部的移动一个单位
- a_k的士兵加1
问在m天内,怎么让数组上士兵不为空的格子最多?
- 题目分析
我们先分析拓展一边
其中0代表大本营, 我们怎么让给定d1, 使得运输的时间最短?— 当然是先屯兵,再一起走
我们发现了一件事情, 在行军的过程中大本营也在屯兵
可得:
我们定 则
为了让
我们要让尽可能大,看循环部分的代码
int n, m, k;
void solve() {
cin >> n >> m >> k;
int mx = max(k - 1, n - k);
int mn = min(k - 1, n - k);
int ans = 0;
for (int d2 = 0; d2 <= mn; ++d2) {
for (int d1 = mx; d1 >= d2; --d1) {
if (d2 + 2 * d1 - 1 <= m) {ans = max(ans, d1 + d2 + 1); break;}
}
}
cout << ans << endl;
}
🏷️ Codeforces
🏷️ Codeforces
Footnotes
-
Mex是最小的未出现的正整数 ↩