1 条题解
-
0
我们在下文中沿用以下记号:
下文将「先手获胜当且仅当 」称为「论断 」。
除特殊说明外,后面的情况中不考虑前面的情况。
情况 1
,后手获胜。
情况 2
,此时只能靠条件 1 取胜,适用论断 。
情况 3
,此时只能靠条件 1 取胜,适用论断 。
情况 4
,根据上面的论断可知 ,此时先手对最小值操作即可获胜。
情况 5
且 ,根据上面的论断可知 ,此时后手和先手做一样的操作即可获胜。
情况 6
考虑某个 且「论断 」声称先手获胜的中间局面(特别地,此时考虑情况 2):
- 如果先手能对最小值操作,则获胜。
- 否则一定有 ,于是 ,适用论断 :先手获胜。
继续考虑某个 且论断 声称「先手获胜」的中间局面:
- 根据上面的论断可知 和 不同时成立。
- 于是先手对最大值操作,依然有 。
- 如果后手接下来的操作使得 ,则根据上面的论断可知先手获胜。
- 否则仍然有 (一次操作中 变化量的绝对值不会超过 ),回到了此局面。
综上所述,本情况适用论断 ,并且没有「情况 7」了。
#include <bits/stdc++.h> using namespace std; int main() { long long n, k, x, s = 0, c1 = 0, c2 = 1000000000; while (cin >> n >> k) { s = 0; c1 = 0; c2 = 1000000000; for (int i = 1; i <= n; i++) { cin >> x; s += x; c1 = max(c1, x); c2 = min(c2, x); } if (c1 - c2 >= k) { puts("No"); continue; } if (c1 - c2 == k - 1 && c2 && n != 1) { puts("Yes"); continue; } if (c1 == c2 && c2 >= 2 && k == 2 && n != 1) { puts("No"); continue; } if (s % 2) { puts("Yes"); continue; } puts("No"); } return 0; }
- 1
信息
- ID
- 206
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 18
- 已通过
- 4
- 上传者