http://acm.hdu.edu.cn/showproblem.php?pid=5011

有N堆珠子,两个人轮流拿,最少拿一个,可以全拿,每次只能从一个堆里拿,不能从多堆同时拿;拿完之后该人还有一个操作,对操作的堆要么不动要么将该堆分成两部分(不一定均分),谁最后一个拿完谁获胜。

而无论怎么划分,划分过后的个数是不变的,所以直接对原来的堆数之间进行异或运算,结果为1,则第一个操作的人获胜,结果为0,第二个操作的人获胜。

#include<iostream>
using namespace std;
int main(){
int i,t,n,k,m;
while(cin>>n){
m=0; t=0;
for(i=0;i<n;i++){
cin>>k;
if(k>=1) t++;
m^=k;
}
if((m==0&&t>=2)||(m!=0&&t==0))
cout<<"Lose\n";
else
cout<<"Win\n";
}
return 0;
}
04-28 14:32