题目在此,链接
题意:
对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。
最后谁无子可取即输。
分析:
首先看两堆:1 1 的状态肯定是先手输~~但是俩数不一样的话就是先手赢了。。
再看三堆:1 1 1的状态肯定是先手赢,1 2 1也是先手赢。。。1 2 2也是先手赢。。总之都是先手赢。。
再看四堆:1 1 2 2 这样的肯定是先手输。。1 1 2 3 这样的就是先手赢了。。。1 2 3 4是先手赢。。
再看五堆:1 1 1 1 1 是先手赢。。1 1 1 1 2 先手赢。。。。…………都是先手赢。。1 2 3 4 1 也是先手赢。。。。各种先手赢。。
由上我们可以得出结论。。。堆的个数为奇数的情况下。。各种先手赢。总是先手赢。。。堆的数目为偶数的情况下。。如果当前各个堆的石头数目能够对称。。也就是说。。把石头数目排序之后。。第1、2堆数量相等。。3、4堆数量相等,5、6堆数量相等………………这样的情况下。。先手必输。。其他情况都是先手赢。。。
代码:写的不是太好。。其实可以用bool型,通过翻转来解决。。效率快多了。。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int stone[11], num[101];
while (scanf("%d", &n), n)
{
int i;
memset(num, 0, sizeof(num));
for (i=0; i<n; i++)
{
scanf("%d", &stone[i]);
num[stone[i]] ++;
}
sort(stone, stone+1);
int number = 0;
for (i=1; i<=100; i++)
if (num[i] % 2 == 1)
number ++;
if (number) puts("1");
else puts("0");
}
return 0;
}