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