这题是楼教主男人八题之一!!
这道题看起来比普通的取石子游戏要难,其实要简单的多。
从简单开始推起。
首先假设只有一堆石子,那么显然先手必胜。
再来看假设有两堆数目相同,那么按照两者都按最优策略来取石子,显然后手必胜。
那么如果是两堆石子数目不同的石子呢?
很显然,先手可以先取多的那一堆把他变成两堆数目相同的石子,然后就变成了上一种情况,此时先手又是必胜。
然后继续推导下去…
然后就发现了一个神奇的规则:
-
当石子为奇数堆时,先手必胜,先手可以把石子数最多的那堆取出,排序后使每连续的两堆石子相等;
-
当石子为偶数堆时,又分两种情况:
(1). 如果能够达到每堆石子都相等的局面,先手必败;
(2). 如果不能够,先手必胜,依然可以变成两两相等。
然后就解决了,代码很短:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,p[21];
int main()
{
while(scanf("%d",&n)!=EOF&&n!=0)
{
memset(p,0,sizeof(p));
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
if(n%2==1)
printf("1\n");
else
{
int i;
sort(p+1,p+n+1);
for(i=1;i<=n;i+=2)
if(p[i]!=p[i+1])
break;
if(i==n+1)
printf("0\n");
else
printf("1\n");
}
}
return 0;
}