/**State: 1704 Accepted 200K 16MS C++ 594B*题目大意:* 一个1*M的棋盘上有N个棋子,初始位置一定,两人轮流操作,* 每次移动一枚棋子,要求只能向左移且至少移动一格,而且不* 能到达或经过以前有棋子的格子,谁无法移动棋子就算输。*解题思路:* 先考虑两个棋子靠在一起的时候,这两对棋子就构成了一个* 奇异局势(P点)。所以可以把题目中的棋子分解为两对两对,* 两对两对之间是不需要考虑什么的。在同一对棋子中,如果对* 手移动前一个,你总能对后一个移动相同的步数,所以一对* 棋子的前一个和前一对棋子的后一个之间有多少个空位置对* 最终的结果是没有影响的。每两对构成一组,而这两对之间就* 是一堆石子。然后就可以Nim博弈了。注意如果是奇数个棋子,* 首个棋子要跟棋盘首构成一对。*/
View Code
#include#include #include using namespace std;const int MAX = 10005;int main(void){ int cas; scanf("%d", &cas); while(cas--) { int ini[MAX]; int n; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &ini[i]); sort(ini, ini + n); int sum = 0; for(int i = n - 1; i >= 0; i -= 2) { int tmp; if(i == 0) tmp = ini[i] - 1; else tmp = ini[i] - ini[i - 1] - 1; sum ^= tmp; } if(!sum) printf("Bob will win\n"); else printf("Georgia will win\n"); } return 0;}