4.1.5 Georigia and Bob
Problem description:
Georgia and Bob 在玩一个游戏。

如图所示,排成直线的格子上放有n个棋子。棋子 i 在左数第 Pi 个格子上。Georgia 和 Bob 轮流选择一个棋子向左移动。每次可以移动一格及以上任意多格,但是不允许反超其他的棋子,也不允许将两个棋子放在同一格子内。无法进行移动操作的一方失败,假设Georgia 先移动,当双方都采取最优策略时,谁会获胜?
1<=n<=1000
1<=Pi<=10000
Input:
n = 3;
p = { 1, 2 , 3}
Output:
Bob wins
思路:将其看成一种Nim游戏。
如果将棋子两两成对当作整体考虑,我们就可以把这个游戏转化为 Nim 游戏,先按棋子个数的奇偶分情况讨论。
当棋子个数为偶数时,把棋子从前往后两两组成一队,那么,我们就可以将每队棋子看成 Nim 中的一堆石子。石子堆中石子的个数等于两个棋子之间的间隔。

为什么可以这样转化,考虑其中的某一对棋子,将右边的棋子向左移动就相当于从 Nim 的石子堆中取走石子。

另一方面,将左边的棋子向左移动,石子的数量就增加了。这就与 Nim 不同了。但是,即使对手增加了石子的数量,只要将所加部分减回去就回到了原来的状态;即便自己增加了石子的数量,只要对手将所加的部分减回去也回到了原来的状态。因此,该游戏的胜负状态和所转移成的 Nim 的胜负状态是一致的。

当棋子的个数为奇数时,对最左边的棋子按下图进行特殊处理后,同样可以转成 Nim 。

Code:
int MAX_N = ;
int N, P[MAX_N];
void solve(){
if(N%==) p[N++]=;
sort(P,P+N);
int x=;
for(int i=;i+<N;i+=)
x^=(P[i+]-P[i]-);
if(x==) puts("Bob wins");
else puts("Georgia wins");
}
4.1.5 Georigia and Bob的更多相关文章
- POJ1704 Georgia and Bob
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9771 Accepted: 3220 Description Georg ...
- 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob
Alice and Bob Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
- Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...
- Alice and Bob 要用到辗转相减
Alice and BobTime Limit: 1 Sec Memory Limit: 64 MBSubmit: 255 Solved: 43 Description Alice is a be ...
- sdutoj 2608 Alice and Bob
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2608 Alice and Bob Time L ...
- hdu 4268 Alice and Bob
Alice and Bob Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- [翻译]Bob大叔:反思极限编程
译者注: Bob大叔14年后再次谈论极限编程.极限编程经历了14年的风风雨雨后,Bob大叔将会给它怎么样的定义那? 在我手中拿着的一本白皮薄书,在14年前彻底的改变了软件世界.这本书的标题是解析极限编 ...
- ifrog-1028 Bob and Alice are playing numbers(trie树)
题目链接: Bob and Alice are playing numbers DESCRIPTION Bob and his girl friend are playing game togethe ...
随机推荐
- linux基础之网络基础配置
基础命令:ifconfig/route/netstat,ip/ss,nmcli 一.ifconfig/route/netstat相关命令 1. ifconfig - configure a netw ...
- Vistual Studio Code配置
目录 查看版本,帮助: 修改vscode的扩展目录: 用户和工作区设置 用户设置的文件保存在如下目录: 所以有三种方式更改默认的设置: vscode同步配置: vscode启动launch.json配 ...
- 数据库03_SQL语句
由于在笔试中遇到写sql语句的题目,犯了低级错误,这里学习并总结一下,遇到相关的继续更新... 数据定义 1.创建数据库 create database testdb; 2.创建空表 需要指明表明.字 ...
- HDU 3507 Print Article(斜率优化)
显然的斜率优化模型 但是单调队列维护斜率单调性的时候出现了莫名的锅orz 代码 #include <cstdio> #include <algorithm> #include ...
- Validation in jQuery
jquery.validate.js github地址 官方主页 doc demo jquery-validation-unobtrusive github地址 demo doc
- 获得WebBrowser中的图片数据
/// <summary> /// 获取WebBrowser指定的图片 /// </summary> /// <param name="webBrowser&q ...
- 同上篇 这篇是针对mesh的
资源加载性能测试代码 与上篇所提出的测试代码一样,我们对于其他资源的加载性能分析同样使用该测试代码.我们将每种资源均制作成一定大小的AssetBundle文件,并逐一通过以下代码在不同设备上进行加载, ...
- 网页title左边显示网页的logo图标
打开某一个网页会在浏览器的标签栏处显示该网页的标题和图标,当网页被添加到收藏夹或者书签中时也会出现网页的图标,怎么在网页title左边显示网页的logo图标呢? 方法1: 找一个或者作一个ico文件, ...
- 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息
1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享 ...
- 自动化测试基础-断言(Assert)使用方法
junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类.1.assertTrue/False([String message,]boolean condi ...