Description

Input
Output
Sample Input
2 3 1 2 3 8 1 5 6 7 9 12 14 17
Sample Output
Bob will win Georgia will win
题目大意:
给一个1*M的棋盘,上面有N颗棋子,每人每次只能向左移动一颗棋子,并且至少移动一步,两人轮流操作,如果某人不能移动棋子了,那他就输了。
解题思路:将棋子分成两两一组,如果棋子数是奇数,前面补0。如果先手移动的是一组当中左边的棋子,那么后手只要将该组右边的棋子移动相同的步数,就行了;如果先手移动的是右边的棋子,将两颗棋子之间的距离看作是石子的数目,只需按照取石子的操作即可。本题是尼姆博弈类型,有N堆石子,两人轮流取,每人每次至少取一个,最后取完石子的人赢。
将棋子分组后,两两棋子之间的距离为L1,L2,L3,……,Ln,则L1^L2^L3^……^Ln=0时,Bob赢,否则,Georgia赢。
代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int i,j,t,N,T,P[1005];
scanf("%d",&T);
while (T--)
{
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",&P[i]);
sort(P+1,P+1+N);//从小到大排序
t=0;
j=1;
if(N%2==1)//N是奇数时
{
t=P[1]-1;
j++;
}
for(i=j;i<=N;i+=2)
{
t^=P[i+1]-P[i]-1;
}
if(t==0)
puts("Bob will win");
else
puts("Georgia will win");
}
return 0;
}
B - Georgia and Bob,布布扣,bubuko.com
原文:http://blog.csdn.net/yanghuaqings/article/details/38346375