题目:有若干堆石子,每一次需要从一堆石子中拿走一些,然后如果愿意的话,再从这堆石子中拿一些分给其它任意堆。不能操作的人负。
解析:
实际上如果n为偶数,我们就可以把ta们两两配对
转换成只有两堆石子的情况
按照石子数从小到大排序,两两配对成一组,组与组之间互不影响
如果可以完美配对(配对后每一组都有两堆石子数相等),后手必胜
如果不可以完美配对,先手可以将最多的变成和最少的相等
然后利用差值去构造其它的堆使之完美配对,这样先手同样必胜
当n是奇数的时候,先手只需要把最大的那一堆拿走然后分配
使剩下的偶数堆满足完美配对即可,这样就能保证必胜
综上,只有当n为偶数且石子堆可以完美配对的情况下,先手必败
其余情况下,先手必胜
#include<cstdio>
#include<algorithm>
using namespace std;
int a[109];
int main()
{
//freopen("t.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
if(n&1)
{
printf("1\n");
}else
{
sort(a,a+n);
bool fg=true;
for(int i=0;i<n;i+=2)
{
if(a[i]!=a[i+1])
{
fg=false;
break;
}
}
if(fg) printf("0\n");
else printf("1\n");
}
}
return 0;
}