HDU 2516 取石子游戏
2014-04-26 17:28
429 查看
取石子游戏
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2474 Accepted Submission(s): 1423
Problem Description
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".
Input
输入有多组.每组第1行是2<=n<2^31. n=0退出.
Output
先取者负输出"Second win". 先取者胜输出"First win".
参看Sample Output.
Sample Input
2 13 10000 0
Sample Output
Second win Second win First win
Source
ECJTU 2008 Autumn Contest
解题思路:
这是一道组合游戏相关的题目,Nim游戏的简单形式。
当n为1的时候是输出first,
n为2的时候输出second,
n为3的时候也是输出second,
当n为4的时候,第一个人想获胜就必须先取一个,这是剩余的石子数为3,此时无论第二个人如何取,第一个人都能够赢,
当n为5的时候,first不可能获胜,因为他取2时,second直接取掉剩余的3个,取1时,second也是取1,这样就演变为n为3的时候了,所以n为5时候,输出的是second ,
当n为6的时候,first只要取掉1个,就可以让局势变为n为5的时候,输出的是first,
n为7的时候,first取掉2个,又可以变为5的时候,所以也是输出first,
n为8的时候,当first取1个时候,局势变为7的时候,第二个人可以赢,取2时候,变为n为6的时候,也是第二个人赢,取三个时候,second直接取掉剩余的5个,所以,n为8的时候,是输出second。
从上面可以看出,n为2,3,5,8时,这些都是输出second,也就是说这些就是必败点,仔细的人会发现这些满足斐波那契数的规律,可以推断13也是一个必败点,也就是说,只要是斐波那契数,都是必败点,输出的就是second,所以,我们可以利用斐波那契数数的公式:
fib[i]=fib[i-1]+fib[i-2],只要n是斐波那契数,那就输出second。
源代码:
#include <iostream> #include <limits.h> using namespace std; int main() { int n,i; int num[44]={2,3}; for(i=2;i<44;i++) num[i]=num[i-1]+num[i-2]; while(cin>>n&&n) { for(i=0;i<44;i++) if(n==num[i]) break; if(i==44) cout<<"First win"<<endl; else cout<<"Second win"<<endl; } return 0; }
相关文章推荐
- Linux 第二步
- 步入Linux
- ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57
- 几种服务器端IO模型的简单介绍及实现
- ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57
- 黑马程序员_高新技术_JDK1.5的新特性
- 燕歌行
- 燕歌行
- c++-类的初始化列表
- java 字节流 字符流
- xml使用系统整理
- 接口(Interface)的应用方法
- 按键驱动的恩恩怨怨之防抖动
- 异步懒人加载图片(GET和POST请求方式)
- Ogre3D Mesh转换到FBX格式
- Mysql 命令行导入sql数据,访问网站出现中文乱码的解决
- 编程之美 -- 寻找发帖水王,以及扩展题
- javaIO流-2
- ios 图片圆角或圆形处理
- LeetCode 求和问题总结(2sum,3sum,ksum)