Description
At each step of the game,the player choose a pile,remove at least one stones,then freely move stones from this pile to any other pile that still has stones.
For example:n=4 and the piles have (3,1,4,2) stones.If the player chose the first pile and remove one.Then it can reach the follow states.
2 1 4 2
1 2 4 2(move one stone to Pile 2)
1 1 5 2(move one stone to Pile 3)
1 1 4 3(move one stone to Pile 4)
0 2 5 2(move one stone to Pile 2 and another one to Pile 3)
0 2 4 3(move one stone to Pile 2 and another one to Pile 4)
0 1 5 3(move one stone to Pile 3 and another one to Pile 4)
0 3 4 2(move two stones to Pile 2)
0 1 6 2(move two stones to Pile 3)
0 1 4 4(move two stones to Pile 4)
Alice always moves first. Suppose that both Alice and Bob do their best in the game.
You are to write a program to determine who will finally win the game.
Input
The last test case is followed by one zero.
Output
Sample Input
3 2 1 3 2 1 1 0
Sample Output
1 0
解题思路
必胜态能转化为必败态交给对方,始终维持自己必胜态;必败态一次操作只会是必胜态交给对方。
题意:n堆石子,两个人轮流取,每次选一堆至少丢弃1枚石子,然后可以将剩下的任意枚随意放入其他堆中。取完最后的棋子的为胜者,无法进行操作 的为败者。
这题主要是寻找必败态。
如果只有一堆石子,先手必胜态。
如果有两堆石子,并且两堆石子的数量相等,那么先手采取什么样的策略,后手采取一样的策略,先手必败态。
这里解释一下:先手采取什么样的策略,后手采取一样的策略,就能保持两堆石子每轮操作后,个数相等,左后先手面临1,1的必败态。
如果有三堆石子,那么先手可以在第一步取到只剩两堆相同数量的石子,先手必胜。
ps:两堆较少堆的差是不会超过最大堆的。
如果有四堆石子,由于三堆石子是必胜态,所以只要逼对方取完某一堆石子,而只有在四堆石子都为1时,才能迫使某一方取完一堆石子,
只有当四堆石子可以分成两两相等的两队时,先手必败。
总结:
当n为偶,且可以分成n/2对两两相等的石子时,先手必败,否则先手必胜。
当n为偶数,且不能分成两两相等时,先手必胜态。
当n为奇数,总可以选择最大堆,调整成偶数堆两两相等状态,即必败态给对手。
AC代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n, i, a[21];
while(scanf("%d", &n)!=EOF, n)
{
for(i=0; i<n; i++)
scanf("%d", &a[i]);
if( n%2==1 )
printf("1\n");
else
{
sort(a, a+n);
for(i=0; i<n-1; i+=2)
if( a[i]!=a[i + 1] )
{
printf("1\n");
break;
}
if( i==n )
printf("0\n");
}
}
return 0;
}