poj1704

题目大意:n个石子,每次可以取一个石子向左移动,左边有边界限制,每个位置最多同时放一个石子,求先手必胜还是必败。

首先,我们将石子两两配对,每一对,若是先手可以将左边的向左移动一格,则可以用后手将右边的石子向左移动,则我们将每2个石子配成一对。注意若是奇数堆,最左边的一堆要和边界配对,将每对之间的空格看做一堆石子做nim即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 int T,a[200005],b[200005],n;
 8 int main(){
 9     scanf("%d",&T);
10     while (T--){
11         scanf("%d",&n);
12         for (int i=0;i<n;i++)
13          scanf("%d",&a[i]);
14         std::sort(a,a+n);
15         int ans=0;
16         for (int i=n-1;i>=0;i-=2){
17             int tmp;
18             if (i==0) tmp=a[i]-1;
19             else tmp=a[i]-a[i-1]-1;
20             ans^=tmp;
21         }
22         if (ans) printf("Georgia will win
");
23         else printf("Bob will win
");   
24     }
25 }
原文地址:https://www.cnblogs.com/qzqzgfy/p/5266713.html