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\n"); 23 else printf("Bob will win\n"); 24 } 25 }