Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 2835 | Accepted: 1434 |
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
Source
这是楼教主男人八题中的一道,就是一道博弈题。
仔细分析,当组数为奇数的时候,先者必胜
当组数为偶数时候,如果2N组可分为N组两两相同的组,就是先行者必败。
关键在于找必败点
分析:
只有一堆时先手必胜。
有两堆时若两堆相等则后手只用和先手一样决策即可保证胜利,后手必胜。若不同则先手可以使其变成相等的两堆,先手必胜。
有三堆时先手只用一次决策即可将其变成两堆相等的局面,先手必胜。
有四堆时由于三堆必胜,无论先手后手都想逼对方取完其中一堆,而只有在四堆都为一颗时才会有人取完其中一堆,联系前面的结论可以发现,只有当四堆可以分成两两相等的两对时先手才会失败。
从而得到3条性质
首先,末状态为必败态,第一条性质符合。
其次,可以证明任何一个胜态都有策略变成必败态(分奇数堆和偶数堆两种情况讨论)。
最后,证明任何一个必败态都无法变成另一个必败态(比较简单)。
#include<stdio.h>
#include<string.h>
int main()
{
int n,x,a[101];
while((scanf("%d",&n),n)!=0)
{
memset(a,0,sizeof(a));
bool f=false;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
a[x]++;
if(x!=0) f=true;
}
if(!f) printf("0/n");
else
if(n%2==1) printf("1/n");
else
{
bool flag=true;
for(int i=0;i<=100;i++)
if(a[i]%2==1) {flag=false;break;}
if(!flag) printf("1/n");
else printf("0/n");
}
}
return 0;
}