AOJ.832 路边骗局


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
3
1 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<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");

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值