1041 竞赛游戏

来源:互联网 发布:python可以机器人 编辑:程序博客网 时间:2024/04/25 23:47

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

 

思路报告

         这道题目如果在了解异或运算性质后,就无须多证明了,直接给出结论!将n堆石子的数量做异或运算,若结果为0,则A必败,否则A必胜。因为当结果为0时,A只要取走石子,结果就不可能再是0 了,当B移动时,B可以通过取走适当的石子数,使新的石子数量状态异或结果仍为0,这样一直进行下去,B最终给A的状态就是一个0状态,A输!反之亦然。

answer

#include <stdio.h>

void main()
{
 int n;
 int NStone,sum;
 while(scanf("%d",&n)!=EOF)
 {
  sum = 0;
  for(int i=0;i<n;i++)
  {
   scanf("%d",&NStone);
   sum = sum^NStone;
  }
  if(sum==0)
   printf("No\n");
  else
   printf("Yes\n");
 }
}

 

原创粉丝点击