Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 1 Submission Accepted: 1
Judge By Case
Description
作为一个江湖骗子,night_watcher又在路边行骗了。现在他正在路边向路人介绍他的新游戏:
有N堆石子 两个人轮流对其操作 。操作分为两步 第一步是每个人必须执行的:从某堆石子中取一部分(至少一个) 丢弃;第二步可以选择执行或不执行:从之前操作的那堆中拿一部分出来构成新堆。两个人轮流操作,不能操作的人被认为输。
现在给出N堆石子每一堆的个数,假设每次都是路人先操作,且两人都足够聪明,请问路人能否取胜。
输入:
第1行: n, 代表石子堆个数(1 <=n<=1000);
第2行: n个正整数,每两个正整数用空格隔开,代表n堆石子中每一堆的数量,每堆石子数不超过10000
有N堆石子 两个人轮流对其操作 。操作分为两步 第一步是每个人必须执行的:从某堆石子中取一部分(至少一个) 丢弃;第二步可以选择执行或不执行:从之前操作的那堆中拿一部分出来构成新堆。两个人轮流操作,不能操作的人被认为输。
现在给出N堆石子每一堆的个数,假设每次都是路人先操作,且两人都足够聪明,请问路人能否取胜。
输入:
第1行: n, 代表石子堆个数(1 <=n<=1000);
第2行: n个正整数,每两个正整数用空格隔开,代表n堆石子中每一堆的数量,每堆石子数不超过10000
Input
第1行: n, 代表石子堆个数(1 <=n<=1000);
第2行: n个正整数,每两个正整数用空格隔开,代表n堆石子中每一堆的数量,每堆石子数不超过10000
第2行: n个正整数,每两个正整数用空格隔开,代表n堆石子中每一堆的数量,每堆石子数不超过10000
Output
一共1行, 其中每行输出"Yes"或"No"(不用输出双引号), "Yes"表示路人取胜, "No"表示night_watcher取胜.
Sample Input
Original | Transformed |
3 1 2 7
3[EOL] 1[SP]2[SP]7[EOF]
Sample Output
Original | Transformed |
Yes
来自AOJ ACM培训班第五次训练
先手必胜:a1^a2^...^an!=0 先手必败:a1^a2^...^an=0 证明: 1、游戏结束状态(0,0,0,0...,0)确实是先手必败态 2、对于一个先手必胜态(xor和>0)确实可以转移到一个先手必败态(xor和=0),这里等价于Nim游戏 3、下证一个先手必败态(xor和=0),不可以转移到一个先手必败态(xor和=0) (1) 如果不进行第二步,那么等价于Nim游戏,证毕 (2)如果进行第二部,考虑反证法,假设某个位置的a可以拆成x和y,满足: x+y<a x^y=a 实际发现这样的x和y是不存在的 时间复杂度O(n)
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 1010; int main() { //freopen("Text.txt", "r", stdin); int n, i, a; while (scanf("%d", &n) != EOF) { int ans = 0; for (i = 0; i < n; i++) { scanf("%d", &a); ans ^= a; } if (ans) printf("Yes\n"); else printf("No\n"); } }