首页 > 其他 > 详细

poj1704

时间:2016-03-11 18:49:09      阅读:236      评论:0      收藏:0      [点我收藏+]

题目大意: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 }

 

poj1704

原文:http://www.cnblogs.com/qzqzgfy/p/5266713.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!