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
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;
}