HDU 2516 取石子游戏(斐波那契博弈)

题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。

完者胜.先取者负输出"Second win".先取者胜输出"First win".


思路:如果不知道斐波那契博弈的话,这题也可以一个个手算下小数据,就会发现必败态都是当石子数为斐波那契数。

关于斐波那契博弈的证明:点击打开链接


代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x7fffffff;
const int maxn = 1e3+5;
ll fib[maxn] = {1, 2};

int main(void)
{
    set<ll> s;
    s.insert(1);
    s.insert(2);
    for(int i = 2; i < maxn; i++)
    {
        fib[i] = fib[i-1]+fib[i-2];
        if(fib[i] > INF) break;
        s.insert(fib[i]);
    }
    ll n;
    while(cin >> n && n)
    {
        if(s.find(n) != s.end()) puts("Second win");
        else puts("First win");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值