1 条题解
-
0
CF1990A Submission Bait 题解
题意回顾
Alice 和 Bob 在一个长度为 的数组 上博弈。初始 。每轮操作:选择一个 ,将 更新为 ,并将该位置置为 。无法操作者输。Alice 先手,问 Alice 是否有必胜策略。
关键观察
由于每次操作后 只增不减,玩家后续只能选择 的数。一旦某个较小值被跳过,就再也无法被选取。
因此游戏的核心在于最大值:如果先手直接选取最大值 ,则 变为 ,后续双方都只能选 。游戏变为双方轮流取 ,直到 取完,无法继续的一方输。
如果最大值 出现奇数次,先手取走最后一个 ,后手无法操作,先手胜。
如果最大值 出现偶数次,后手取走最后一个 ,先手无法操作,先手败。可能有人会问:先手能否不选最大值,而选一个较小的值来改变局面?
如果先手选较小值 ,。此时后手可以直接选 (因为 )。局面转为:后手选了第一个 ,相当于后手在"最大值游戏"中变成了先手。此后双方只能选 。若 有偶数个,后手(作为 的新先手)会取到最后一个 ,先手反而输。若 有奇数个,后手选 后留给先手偶数个 ,先手同样输。所以先手选非最大值永远不如直接选最大值。综上:Alice 必胜当且仅当数组中的最大值出现奇数次。
正确解法
- 读入数组,找到最大值 。
- 统计 的出现次数 。
- 若 为奇数,输出
YES;否则输出NO。
时间复杂度 每测试用例,足够通过 的限制。
参考代码
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> a(n); int mx = 0; for (int i = 0; i < n; i++) { cin >> a[i]; if (a[i] > mx) mx = a[i]; } int cnt = 0; for (int i = 0; i < n; i++) if (a[i] == mx) cnt++; cout << (cnt % 2 ? "YES" : "NO") << '\n'; } return 0; }
备注
原给出代码的判定逻辑为"若所有值的出现次数均为奇数则 NO,否则 YES",该结论与样例不符,存在错误。正确结论仅需关注最大值出现次数的奇偶性。
- 1
信息
- ID
- 6895
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者