首页 > 其他 > 详细

hdu 2516

时间:2019-03-06 20:52:37      阅读:183      评论:0      收藏:0      [点我收藏+]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516

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
 
解题思路:Fibonacci博弈

 有一堆个数为n的石子,游戏双方轮流取石子,满足: 

(1)先手不能在第一次把所有的石子取完; 

(2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。 约定取走最后一个石子的人为赢家。

2、解决思路:

  当n为Fibonacci数时,先手必败。即存在先手的必败态当且仅当石头个数为Fibonacci数。 

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>;
using namespace std;
int n,m,a[100005];
map<int,int> mp;
int main(){
    a[0]=1; a[1]=1;
    mp[1]=1;
    for(int i=2;i<=10000;i++){
        a[i]=a[i-1]+a[i-2];
        mp[a[i]]++;
    }
    while(cin>>n&&n){
        if(mp[n])puts("Second win");
        else puts("First win");
    }
    return 0;
}

 

hdu 2516

原文:https://www.cnblogs.com/zjl192628928/p/10485737.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!