题目链接

http://poj.org/problem?id=1704

这个题目是个好题,没有两下子是做不出的,其中考到,要你排序,如何把题目化成我们熟知的东西,

在这个题中我开始用选择法排序,他给我个wang answer,我表示不理解,但用sort AC了,谁知道可以告诉我一声,表示不甚感激!

题目的思路(来自网上)很遗憾自己开始连题目的看不懂,思路更不用说了。

这题是暑假ACM集训时做的,是尼姆博弈的变形运用,最初做这题时,把任意两棋子之间的距离当做了尼姆博弈中的一堆石子(或纸牌)。这想法太天真了,经高手指点后,发现要把棋子配对。现在假设处于这种情况——每两个棋子都是紧挨着的。这种状态是种必败的状态,无论你移动哪个棋子,下个玩家会移动另一个棋子,使他们再次紧挨着。这样移动前后可以看成是同种状态,所以我们可以假设配对的棋子中前一个棋子是不动的,每次移动后一个棋子减少距离,谁能最后使配对的棋子全部紧挨谁就胜利(就同尼姆博弈中取走一堆中的石子一样,谁最后取完谁胜)。细心的人会发现,如果棋子数量是奇数怎么配对,如果从前往后配对,最后一个棋子的状态就不好固定了,所以从后往前陪。第一个棋子可以想象为与左边界配对。poj中的输入样例是从从小到大的,但题中没给出说明,所以我们要对输入的数据排序,才能得到正确的解。

开始看到此题的时候完全没有什么思路,但是看”寻找必败态——一类问题的快速解法“的解释如下:

分析:
       乍一看这一题棋子移动还要受其他棋子的限制,好像无法求出通解,但仔细分析会发现别有洞天。
                    
        一个棋子每一次向左移的最大步数是固定的,而且随着移动减少,不是和取石子很像么?那么和取石子的区别在哪呢?就在于每一次移动时都会让右边相邻的那颗棋子移动空间变大,这样就和取石子只减不增有所不同了,我们应该怎样解决这个问题呢?
        我们并不放弃将其与我们熟悉的取石子对应,但我们将策略做小小的变动:
                    
        将棋子从右端向左端每相邻两个分为一对,如果只剩一个就将棋盘左端加一格放一颗棋子与之配对,这样配对后好像和以前没有什么区别,但决策时就方便多了,因为我们大可不必关心组与组之间的距离,当对手移动一组中靠左边的棋子时,我们只需将靠右的那一颗移动相同步数即可!同时我们把每一组两颗棋子的距离视作一堆石子,在对手移动两颗棋子中靠右的那一颗时,我们就和他玩取石子游戏,这样就把本题与取石子对应上了。
         本例说明有许多模型看似复杂,但经过一些巧妙的变换,便可以转化成一些我们熟悉的模型,同时也充分体现了博弈的灵活。
         如果说前面的例子是介绍这种思想的运用的话,下面的方法就是讲这种思路的优越性了,因为这一题并不是走的“手推小数据=〉猜想=〉证明”的老路,而是直接利用性质推导必败条件

其实看了上面的分析之后还不是很明白,在网上搜了一下如下的解释比较容易理解:

/*由于任何两个相邻的棋子只与他们之间的空位有关,所以可以转化为普通的Nim游戏:我们可以把这些空位看作是石子数,谁取得了最后一个空位,谁就是赢家。*/

我的代码

这里n==1的情况要单独考虑。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main(void)
{
int t,n,a[10005],k,i,j;
scanf("%d",&t);
while(t--)
{
k=0;
a[0]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
/*for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
a[i]=a[i]^a[j]^(a[j]=a[i]);
}
}*/
if(n==1&&a[1]==1)
printf("Bob will win\n");
else if(n==1&&a[1]!=1)
printf("Georgia will win\n");
else
{
if(n%2)
{
for(i=1;i<=n;i++,i++)
k=k^(a[i]-a[i-1]-1);
}
else
{
for(i=2;i<=n;i++,i++)
k=k^(a[i]-a[i-1]-1);
}
if(k==0)
printf("Bob will win\n");
else
printf("Georgia will win\n");
}
}
return 0;
}

这题很好,是个好题。

PKU-1704-Georgia and Bob的更多相关文章

  1. 【POJ】1704 Georgia and Bob(Staircase Nim)

    Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...

  2. poj 1704 Georgia and Bob(阶梯博弈)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9363   Accepted: 3055 D ...

  3. [原博客] POJ 1704 Georgia and Bob

    题目链接题意:如图,Georgia和Bob在玩游戏.一个无限长的棋盘上有N个旗子,第i个棋子的位置可以用Pi表示.现在Georgia先走.每个人每一次可以把一枚棋子向左移动任意个格子,但是不能超越其他 ...

  4. poj 1704 Georgia and Bob(阶梯博弈)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8656   Accepted: 2751 D ...

  5. POJ 1704 Georgia and Bob(阶梯Nim博弈)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11357   Accepted: 3749 Description Geor ...

  6. hdu 4315 Climbing the Hill && poj 1704 Georgia and Bob阶梯博弈--尼姆博弈

    参考博客 先讲一下Georgia and Bob: 题意: 给你一排球的位置(全部在x轴上操作),你要把他们都移动到0位置,每次至少走一步且不能超过他前面(下标小)的那个球,谁不能操作谁就输了 题解: ...

  7. poj 1704 Georgia and Bob (nim)

    题意: N个棋子,位置分别是p[1]...p[N]. Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边[位置1]且不能不移) Georgia ...

  8. POJ 1704 Georgia and Bob (Nim游戏变形)

    题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...

  9. POJ 1704 Georgia and Bob(阶梯博弈+证明)

    POJ 1704 题目链接 关于阶梯博弈有如下定理: 将所有奇数阶梯看作n堆石头,做Nim,将石头从奇数堆移动到偶数堆看作取走石头,同样地,异或值不为0(利己态)时,先手必胜. 定理证明看此博:htt ...

  10. POJ 1704 Georgia and Bob【博弈】

    题目链接: http://poj.org/problem?id=1704 题意: 给定棋子及其在格子上的坐标,两个人轮流选择一个棋子向左移动,每次至少移动一格,但是不可以碰到其他棋子.无路可走的时候视 ...

随机推荐

  1. CentOS 6.2 安装vsftpd 服务器(转)

    CentOS 6.2 安装vsftpd 服务器 本人的CentOS 6.2是安装在win 2008 R2 server 的 Hyper-V 虚拟机中.centos使用光盘安装,以最小模式安装,完成后用 ...

  2. HRBUST 1909 理工门外的树(双数组实现线段树功能)

    线段树固然可以做,但是在考虑线段树之前应该先考虑一下,这种用两个数组来解决问题的方法能不能行,如果行的话,就会为我们省很多时间,毕竟线段树代码量比较大 #include<iostream> ...

  3. PAT (Advanced Level) 1056. Mice and Rice (25)

    简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...

  4. Python之路:线程池

    版本一 #!/usr/bin/env  python # --*--coding:utf-8 --*-- import Queue import threading class ThreadPool( ...

  5. .net remoting 实现通用消息处理窗口

    .net remoting 实现通用消息处理窗口 实现机制是制作一个cmd窗口作为信息展示窗口,主程序将需要展示的信息抛出到cmd窗口显示,以此方式做到消息的展示. 以下是cmd窗口的代码,cmd窗体 ...

  6. PAT (Advanced Level) 1082. Read Number in Chinese (25)

    模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  7. Nexus搭建私服 学习

    为什么要搭建nexus私服 因为有些公司不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以,有必要再局域网里找一台有外网权限的机器.搭建nexus私服,然后开发人员连接到这台私服 ...

  8. JQuery的插件开发——重点

    1.给JQuery全局对象扩展一个函数方法 $.log=function(){ /* 给全局对象$扩展一个函数*/ } $.log;//调用方法 2.给JQuery普通对象扩展一个函数方法 3.使用第 ...

  9. form2js的使用(续BootstrapTable)

    通过收集表单数据,并且转换为json格式,实现表格的查询. 引入插件:不要忘记引入jquery. <script src="${ctx}/assets/plugins/form2js/ ...

  10. CodeForces 660B Seating On Bus

    模拟. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #inc ...