AOJ.832 路边骗局

来源:互联网 发布:手工皮鞋店铺推荐知乎 编辑:程序博客网 时间:2024/06/10 09:09

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

Input
第1行: n, 代表石子堆个数(1 <=n<=1000);
第2行: n个正整数,每两个正整数用空格隔开,代表n堆石子中每一堆的数量,每堆石子数不超过10000

Output
一共1行, 其中每行输出"Yes"或"No"(不用输出双引号), "Yes"表示路人取胜, "No"表示night_watcher取胜.


Sample Input
OriginalTransformed
31 2 7
3[EOL] 1[SP]2[SP]7[EOF] 

Sample Output
OriginalTransformed
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<ax^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");elseprintf("No\n");}}

原创粉丝点击