40086311Nim

试题描述
有n堆石子,每堆各有ai颗石子。Alice和Bob轮流从非空的石子堆中取走至少一颗石子。Alice先取,取光所有石子的一方获胜。S双方都采取最优策略时,谁会获胜?
输入
一行,共n+1个数,第一个数为n,接下来共有n个数,两两之间用一个空格隔开。
输出
输出获胜一方的名字。
输入示例
3 1 2 4
输出示例
Alice
其他说明
1≤n≤ 1000000,1≤ai≤ 109
 
 1 #include <iostream>
 2 
 3 using namespace std;
 4 int p[105];
 5 int main()
 6 {
 7     int n,i,sum=0,cnt=0;
 8     scanf("%d",&n);
 9     for(i=1;i<=n;i++)
10     {
11         scanf("%d",&p[i]);
12         sum=p[i]^sum;   //求p[i]和sum的异或值 
13     }
14     for(i=1;i<=n;i++)
15         if(p[i]>(sum^p[i])) {cnt++;break;}    //注意'^'的优先级小于'>',所以要加括号 
16     if(cnt>0) printf("Alice");
17     else printf("Bob");
18     //system("pause");
19     return 0;
20 }
21 //^的意思不是乘方而是"异或"。
22 //异或:二进制中,00或11都是0,10或01都是1。可以理解为不考虑进位的二进制加法。(1+1=0进位是1,舍去后当前位是0) 
23 //本题规律:算每堆数量的异或,如果为0,则先手败,反之先手胜。 
40086311Nim

 具体分析见相册。

posted @ 2016-03-11 17:19  姚呵呵  阅读(261)  评论(0编辑  收藏  举报