题意:Alice和Bob一起玩游戏,给定几个堆得石子,A和B分别拿一个堆中任意石子可放到其他石子数不为0的堆中
不能移动的人输,Alice为先手,若他赢输出1否则输出0;
题解:若有1堆石子则A必胜
若2堆石子个数相同,则无论先手怎么取,后手可取相同的将石子数还原
不同,则先手可将两堆石子变相等,此时面对石子数相等的人必败
可得出结论 奇数堆A必胜,偶数堆时若石子数都是一对一对的则先手必败否则先手胜
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[110],temp[110]; int main() { int n; while(scanf("%d",&n)!=EOF&&n) { memset(temp,0,sizeof(temp)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); temp[a[i]]++; } if(n%2)//奇数堆先手必胜 { cout<<"1"<<endl; continue; } int ans=0; for(int i=0;i<105;i++) { if(temp[i]%2)//检查石子数是否都是两两相等的 ans++; } if(ans==0)//若是先手必败 cout<<"0"<<endl; else cout<<"1"<<endl; } }