竞赛游戏(博弈论)

1041 竞赛游戏
Description


A和B准备玩一个游戏,游戏是这样的,一开始桌面上面放了n堆石子,每次每个人能从任意一堆里面取走任意颗石子,直到某个人无法取走石子为止,游戏结束,不能再取石子的人就为输!
A和B在这个游戏中都表现的足够优秀,且总是由A先开始。
现在给定桌面上石子的初始状态,由你来编写程序确定最终获得胜利的是A还是B。
Input


输入包括多组测试数据,每组测试数据占一行包括n+1个数字,第一个数字为n,如题中所述,接下来n个数字代表每堆石子的个数。每堆的石子数量不会超过10000000,堆数n不会超过20,且必大于1。
输入到文件结束。
Output


对于每组测试数据输出一行,如果A能赢输出No,否则输出Yes。
Sample Input


2 45 45
3 3 6 9
Sample Output


No

Yes


题解思路:

起初对这道题的解法没有思路,不过在学过按位异或运算符之后,就很清晰了。

c语言中^为按位异或运算符,若两个二进制位相同,则为结果0,不同为1。

例如:

#include<stdio.h>
int main()
{
int a=6,b=10,c;
c=a^b;
printf("%d\n",c);
}


输出结果: 
12


--------------------------------
Process exited with return value 0
Press any key to continue . . .

将6和10转换为二进制数分别为0110(前面补了个0)和1010,然后按照定义进行异或运算:

0&0=1

1&0=0

1&1=1


0110       a

1010       b

----->1100      a和b最左边第一位和第二位不同,所以分别为1,第三位2和第四位相同,所以分别2为0,二进制数1100,转换为十进制为12。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int nstone[55];
int main()
{
	int nstone,n,sum;
	while(scanf("%d",&n)!=EOF)
	{
		sum=0;
		for(int i=0;i<n;i++)
		scanf("%d",&nstone),sum=sum^nstone;
		printf("%s\n",sum==0?"No":"Yes");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值