题目大意:有一个无限长的一维的棋盘,棋盘上N个格子放置着棋子。两个人轮流操作,每次操作能选择其中一个棋子向左移动,但不能越过其它棋子或者两枚棋子放在同一格中,最后不能操作的人算输,问先手是否必胜?

思路:就是裸的阶梯博弈(staircase nim)方法也很简单。首先每个棋子能向右移动的距离是有限的,最多到前一个棋子处就停止了,比如第一个sample :1 2 3 每个棋子都不能移动就是 0 0 0 第二个sample: 1 5 6 7 9 12 14 17 就是0 3 0 0 1 2 1 2 这样每次移动一枚棋子向左n步,相当于把对应第二排的那个数据减去n,那个数据右边一个数加上n
这样问题就转变成了:有n堆石头,每次可以从一堆中拿出一些或全部石头给相邻的右边的一堆石头,或者最后一堆减去一些或全部石头,谁不能操作谁输,问先手是否必胜?
关于这个问题的结论和证明网上多如牛毛,结论是:假设从最后一堆石头开始与上一堆相间的石头数的异或和为P,P为0时先手必败反之必胜。比如a1,a2,a3,a4,a5   P的值就是a5 xor a3  xor a1

证明无非就是说明当不为平衡态时必然存在操作使局面进入平衡态,而局面已然是平衡态时任何操作都会破坏平衡。这里不再累述。说一下对这个问题的一些直观认识:为了叙述方便,可以把与最后一堆石头相间的石头称为有用堆(这里是我生造的一个词)而其它堆称为无用

堆。

□■□■□■□■□■□

如图空心方块表示有用堆,实心方块表示无用堆,显然把无用堆的石头放到有用堆的操作都是没有意义的,因为这次从无用堆放进多少块石头到有用堆,下一次操作就能将这些运进来的石头扔给下一个无用堆或者扔掉(最后一堆石头),而有用堆石头的序列分毫未变,因此只需看有用堆的石头情况即可。而有用堆的石头放进无用堆相当于扔掉的操作,因为刚才已经证明无用堆中的石头是不起作用毫无意义的,这样就将问题化为了有用堆的NIM游戏!!因此只需计算有用堆的异或和就能计算出先手的胜负情况

//poj1704

#include<cstdio>

#include<string.h>

#include<iostream>

using namespace std;

int a[1009]={0};

void qsort(int l,int r)

{

int i=l,j=r,mid=a[(l+r)>>1],temp;

while(i<j)

{

while(a[i]<mid)i++;while(a[j]>mid)j--;

if(i<=j)

{

temp=a[i];a[i]=a[j];a[j]=temp;

i++;j--;

}

}

if(i<r)qsort(i,r);

if(l<j)qsort(l,j);

}

int main()

{

int n,t,chess[1009]={0};

scanf("%d",&t);

while(t--)

{

int x=0,last=0;

scanf("%d",&n);

for(int i=1;i<=n;i++)scanf("%d",&a[i]);

qsort(1,n);

for(int i=1;i<=n;i++)

{

chess[i]=a[i]-last-1;

last=a[i];

}

for(int i=n;i>=1;i=i-2)

x=x^chess[i];

if (x!=0)printf("Georgia will win\n");else printf("Bobwill win\n");

}

return 0;

}

调试小结:3次WA 原因:未看清棋子顺序不是从小到大!!

Poj1704:staircase nim【博弈】的更多相关文章

  1. POJ1704 Georgia and Bob(Nim博弈变形)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14312   Accepted: 4840 ...

  2. Nim博弈&&POJ1704

    Nim博弈 题目 有n堆物品,两人轮流取,每次取某堆中不少于1个,先取完者胜. 分析 经典问题,该问题的策略也成为了许多问题的基础. 要判断游戏的胜负只需要异或运算就可以了,有以下结论: $a_1 \ ...

  3. HDU 2509 Nim博弈变形

    1.HDU 2509  2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...

  4. HDU 1907 Nim博弈变形

    1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...

  5. zoj3591 Nim(Nim博弈)

    ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博 ...

  6. hdu 1907 John&& hdu 2509 Be the Winner(基础nim博弈)

    Problem Description Little John is playing very funny game with his younger brother. There is one bi ...

  7. 【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, ...

  8. 关于NIM博弈结论的证明

    关于NIM博弈结论的证明 NIM博弈:有k(k>=1)堆数量不一定的物品(石子或豆粒…)两人轮流取,每次只能从一堆中取若干数量(小于等于这堆物品的数量)的物品,判定胜负的条件就是,最后一次取得人 ...

  9. HDU - 1850 Nim博弈

    思路:可以对任意一堆牌进行操作,根据Nim博弈定理--所有堆的数量异或值为0就是P态,否则为N态,那么直接对某堆牌操作能让所有牌异或值为0即可,首先求得所有牌堆的异或值,然后枚举每一堆,用已经得到的异 ...

随机推荐

  1. [转]2010 Ruby on Rails 書單 與 練習作業

    原帖:http://wp.xdite.net/?p=1754 ========= 學習 Ruby on Rails 最快的途徑無非是直接使用 Rails 撰寫產品.而這個過程中若有 mentor 指導 ...

  2. Hacker的社交礼仪与自我修养【转】

    Hacker School是位于纽约的一所特殊的编程“学校”,他们的目标是帮助参与者变成“更好的程序员”,之所以说他们特殊是因为这所“学校”没有老师,没有考试,也不会颁发证书,他们信奉三人行必有我师, ...

  3. Dapper系列之一:Dapper的入门(多表批量插入)

    Dapper介绍  简介:      不知道博客怎么去写去排版,查了好多相关博客,也根据自己做过项目总结,正好最近搭个微服务框架,顺便把搭建微服务框架所运用的知识都进行博客梳理,为了以后复习,就仔细琢 ...

  4. 外文翻译 《How we decide》多巴胺的预言 第一节

    这是第二章的起始... 书的导言 1991年2月24日凌晨.第一与第二海军陆战队大批向北进入了沙特阿拉伯的沙漠地带,他们从这来进入科威特.这批军队是伊拉克入侵8个月以来,同盟国第一批进入科威特的部队. ...

  5. spring mvc 通过拦截器记录请求数据和响应数据

    spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据 ...

  6. configure: error: The LBL Packet Capture Library, libpcap, was not found!

    configure: error:  The LBL Packet Capture Library, libpcap, was not found! yum install libpcap*

  7. redis源码分析之事务Transaction(下)

    接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需 ...

  8. Eclipse--java.lang.OutOfMemoryError: PermGen space

    这一段时间,Eclipse总是死掉,几乎是稍微操作快一点就会死掉,几分钟一次,搞得人郁闷至极.浪费了不少时间,在网上搜了下,看到很多朋友也出现类似的情况,在网上求救,但是网上的办法都只是说通过修改ec ...

  9. 深度剖析 MySQL 事务隔离

    概述 今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别. 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修 ...

  10. python3写冒泡排序

    1.概念理解: 冒泡排序:可以简单的理解为是列表中相近的元素,两两比较,小的在前面.最多需要len()-1次排序. 2.例子:a=[11,7,4,56,35,0] 3.代码实现: 4.输出结果: 第1 ...