【POJ】【1704】Georgia and Bob
组合游戏
Nim游戏的一个变形
题解请看金海峰的博客
以下为引用:
分析:我们把棋子按位置升序排列后,从后往前把他们两两绑定成一对。如果总个数是奇数,就把最前面一个和边界(位置为0)绑定。 在同一对棋子中,如果对手移动前一个,你总能对后一个移动相同的步数,所以一对棋子的前一个和前一对棋子的后一个之间有多少个空位置对最终的结果是没有影 响的。于是我们只需要考虑同一对的两个棋子之间有多少空位。我们把每一对两颗棋子的距离(空位数)视作一堆石子,在对手移动每对两颗棋子中靠右的那一颗 时,移动几位就相当于取几个石子,与取石子游戏对应上了,各堆的石子取尽,就相当再也不能移动棋子了。
我们可能还会考虑一种情况,就是某个玩家故
意破坏,使得问题无法转换为取石子,例如前一个人将某对中的前者左移,而当前玩家不将这对中的另一移动,则会导致本堆石子增多了,不符合nim。但是这种
情况是不会出现的。因为赢家只要按照取石子进行即可获胜,而输家无法主动脱离取石子状态。如果输家想要让某堆石子增多,那么赢家只需要让该堆减少回原状,
这样输家又要面临跟上一回合同样的局面。
- //POJ 1704
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- #define rep(i,n) for(int i=0;i<n;++i)
- #define F(i,j,n) for(int i=j;i<=n;++i)
- #define D(i,j,n) for(int i=j;i>=n;--i)
- using namespace std;
- void read(int &v){
- v=; int sign=; char ch=getchar();
- while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
- while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
- v*=sign;
- }
- /******************tamplate*********************/
- int n,f[];
- int main(){
- freopen("1704.in","r",stdin);
- int t;
- read(t);
- while(t--){
- read(n);
- rep(i,n) read(f[i]);
- if(n&) f[n++]=;
- sort(f,f+n);
- int ans=;
- for(int i=n-;i>;i-=)
- ans^=f[i]-f[i-]-;
- if(ans) printf("Georgia will win\n");
- else printf("Bob will win\n");
- }
- return ;
- }
我的错误思路:
简单的情况:
所有的棋子都挨在一起
那么若有偶数个棋子,则后手胜(2个棋子的话,只能动最靠左的一个,那么无论先手将左1移到哪里,后手都将左2移到紧挨左1的位置,递推可知4、6、8等偶数都是后手胜)
反之先手胜
复杂一点:
所有的棋子分散形成一些连通块,每块有奇数或偶数个棋子(这不是废话吗……),每次移动必然改变两个连通块的奇偶性(移成单独一个棋子相当于新建了一个连通块,那么可以视为将一个连通块从0变成1(偶变奇))
那么: 偶和偶在一起还是偶(后手胜)
奇和奇在一起变成偶(后手胜)
奇和偶在一起还是奇(先手胜)
特判:从左端开始连出来的连通块不能算进来
所以答案就是:数一共有多少个奇连通块,若有奇数个,先手胜;偶数个,后手胜。
先手必胜策略:将第一个奇连通块的第一个棋子移到左端(尽可能靠左),之后按后手策略下“模仿棋”
后手必胜策略:对手若移动一个棋子A,则将A后面的第一个棋子B移到A旁边
先手自己作死的方法:将1、2变成1、1、1
后手作死:同上
以上思路为错误思路
sigh......
Update:
奇+奇--->偶+偶 :先手胜
奇+奇--->奇+奇+偶 :
偶+偶--->
先手必败状态:只有偶连通块
【POJ】【1704】Georgia and Bob的更多相关文章
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...
- 【POJ 1459 power network】
不可以理解的是,测评站上的0ms是怎么搞出来的. 这一题在建立超级源点和超级汇点后就变得温和可爱了.其实它本身就温和可爱.对比了能够找到的题解: (1)艾德蒙·卡普算法(2)迪尼克算法(3)改进版艾德 ...
- 【POJ 2728 Desert King】
Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 27109Accepted: 7527 Description David the ...
- 【POJ 2976 Dropping tests】
Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 13849Accepted: 4851 Description In a certa ...
- 【POJ 3080 Blue Jeans】
Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 19026Accepted: 8466 Description The Genogr ...
- 【POJ各种模板汇总】(写在逆风省选前)(不断更新中)
1.POJ1258 水水的prim……不过poj上硬是没过,wikioi上的原题却过了 #include<cstring> #include<algorithm> #inclu ...
- 【POJ 3669 Meteor Shower】简单BFS
流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...
- 【POJ 2823 Sliding Window】 单调队列
题目大意:给n个数,一个长度为k(k<n)的闭区间从0滑动到n,求滑动中区间的最大值序列和最小值序列. 最大值和最小值是类似的,在此以最大值为例分析. 数据结构要求:能保存最多k个元素,快速取得 ...
- 【POJ 2406 Power Strings】
Time Limit: 3000MSMemory Limit: 65536K Description Given two strings a and b we define a*b to be the ...
- 【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, ...
随机推荐
- Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...
- 【SNMP】Linux系统下安装net-snmp
这里使用的snmp的版本是net-snmp-5.7.3下载地址:http://www.net-snmp.org/download.html 安装步骤: 1.解压缩安装包: tar -xzvf net- ...
- 利用 NUget包 EPPlus 实现数据导出到Excel(适用于DTcms)
首先安装EPPlus 包
- 20141124-JS函数
函数: 函数是由事件驱动或者当它被调用时执行的可重复色代码块. <head> <script> function hanshu() { alert("你好!" ...
- 20141017--类型String类
Console.Write("请输入您的身份证号"); string x=Console.ReadLine();//小string是大String的快捷方式 int i = x.L ...
- think in java 第四版读书笔记 第一章对象导论
很久没有碰过java了,为了项目需要以及以后找工作,还是有必要将think in java通读一遍.欢迎大家一起讨论学习 1.1抽象过程 面向对象语言的5个特性: 1.万物皆对象 任何事物都可以抽象为 ...
- 8套迷人精致的CSS3 3D按钮动画
1.纯CSS3 3D按钮 按钮酷似牛奶般剔透 CSS3按钮一般都可以设计的非常漂亮,利用投影.渐变等CSS3属性特效可以把按钮渲染的十分动感.今天分享的这款CSS3按钮外观非常特别,它看上去酷似晶莹剔 ...
- JVM基础知识总结
因为没深入搞底层研究,所以也就没做很细致的笔记.相关笔记内容是直接从度娘那儿来的,重新删减.整理和加了点自己的东西. 1.JVM(Java Virtual Machine)是什么:JVM是一种用于计算 ...
- Regionals 2013 :: North America - Southeast USA
Regionals 2013 :: North America - Southeast USA It Takes a Village As a Sociologist, you are studyin ...
- c# 取得ip地址和网关
/// <summary> /// 得到本机IP /// </summary> private string GetLocalIP() { //本机IP地址 string st ...