POJ 1704 Georgia and Bob题解
2016-01-18 18:02
281 查看
【题目大意】:
一个很长的格子列上有N 个棋子,开始位置一定,两人轮流操作(Georgia先手),每次移动一枚棋子,要求只能向左移且至少移动一格,而且不能越过任何棋子,最后谁无法移动棋子谁就输。
【分析】:
我们考虑从后往前将棋子两两配对(若N为奇数则想象有一个棋子放在第0号位置,将第一个棋子与其配对即可)。这样我们考虑:游戏的最终目的是将任意两棋间间距变为0。若先手移动了某对棋子中的前一个,那么后手也可以移动该对棋子中的后一个相同步数(由于先手可移动,那么根据规则,后者也可移动相同步数),这样一来,两对棋子的间距就不成问题了,即不影响棋局(因为可等价于先手将某对棋子的第一个移到前一对棋子的第二个的后面,而后手则可将该对棋子的后一个移动相同步数而不影响胜负,这样一来,棋子间距就只剩下每对棋子中的间距了),因而每对棋子中的间距相当于Nim游戏中的石子个数,那么原题的SG函数就是每对棋子间距的亦或和了。
【代码】:
一个很长的格子列上有N 个棋子,开始位置一定,两人轮流操作(Georgia先手),每次移动一枚棋子,要求只能向左移且至少移动一格,而且不能越过任何棋子,最后谁无法移动棋子谁就输。
【分析】:
我们考虑从后往前将棋子两两配对(若N为奇数则想象有一个棋子放在第0号位置,将第一个棋子与其配对即可)。这样我们考虑:游戏的最终目的是将任意两棋间间距变为0。若先手移动了某对棋子中的前一个,那么后手也可以移动该对棋子中的后一个相同步数(由于先手可移动,那么根据规则,后者也可移动相同步数),这样一来,两对棋子的间距就不成问题了,即不影响棋局(因为可等价于先手将某对棋子的第一个移到前一对棋子的第二个的后面,而后手则可将该对棋子的后一个移动相同步数而不影响胜负,这样一来,棋子间距就只剩下每对棋子中的间距了),因而每对棋子中的间距相当于Nim游戏中的石子个数,那么原题的SG函数就是每对棋子间距的亦或和了。
【代码】:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define MAX 1001 int DATA,N,a[MAX]; int main() { scanf("%d",&DATA); for(int data=1;data<=DATA;data++) { scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); sort(a+1,a+1+N); int ans=0; a[0]=0; for(int i=N;i>=1;i-=2) ans^=(a[i]-a[i-1]-1); if(ans) printf("Georgia will win\n"); else printf("Bob will win\n"); } return 0; }
相关文章推荐
- [IOS]调色板
- 初学web开发需要掌握哪些方面?
- postgresql 中分区表的创建及使用样例
- 今天写后台的一些小经验
- python 写excal
- Java实现多线程多节点下载
- VLFeat + VS2013+opencv 配置
- Multiple ways to access QEMU Machine Protocol (QMP)
- 初学hadoop2.7.1(二)配置伪集群
- Qt之MainWindow学习
- Mysql 从零开始(五)函数之字符串函数
- FancyOverFlow的使用
- su普通用户切换root用户失败
- python 字符编码
- 完成wamp安装后Mysql配置记录
- jQuery 取值、赋值的基本方法整理
- mybatis实现批量更新
- IOS添加pch全局引用文件(宏定义)
- 一个开发者账号,多台MAC同时使用
- Android快速开发系列 10个常用工具类