题目链接

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. 利用ZjDroid对 <捕鱼达人3> 脱壳及破解过程-转

    http://blog.sina.com.cn/zihao2015 <捕鱼达人3> 刚出来不久,就被鬼哥Dump出来dex,随之破解也就轻而易举.一开始我用ZjDroid神器试验过,但是没 ...

  2. mr本地运行的几种模式

    MR程序的几种提交运行模式 本地模型运行 1/在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行 ----输入输出数据可以放在本地路 ...

  3. JAVA基础--方法的重写overwrite 和 重载overload

    重写 overwrite或者override: 相同的方法名称, 参数列表和返回类型 重载overload: 方法有相同的名字, 但是参数不同 (参数个数不同, 参数类型不同, 其中一个不同即可), ...

  4. js timer

    <html><head lang="en"> <meta charset="UTF-8"> <title>< ...

  5. 二叉堆(C#)

    参考:http://www.cnblogs.com/skywang12345/p/3610390.html using System; using System.Collections.Generic ...

  6. w3c学习总结1

    1.根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选项.HTML5 规范声明:应该使用 <h1> - <h6> 来表示标题,使 ...

  7. DNS远程和DNS日志

    三.rndc远程控制服务器 1.在被管理的服务器上生成密钥 # cd /var/named/chroot/etc # rndc-confgen -a -b 128 -k mrndc-key -c mr ...

  8. mysql 数据库 切表的脚本

    #!/bin/sh host=$1 port=$2 host=${host:="localhost"}  #host没赋值,那么就赋值为localhost port=${port: ...

  9. P4语言编程快速开始 实践二

    参考:P4语言编程快速开始 上一篇系列博客:P4语言编程快速开始 实践二 Demo 2 本Demo所做的修改及实现的功能: 为simple_router添加一个计数器(counter),该计数器附加( ...

  10. Spring MVC之Action输入参数

    第一部分:Action输入参数Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法.Spring MVC方法 ...