zoukankan      html  css  js  c++  java
  • HDU2516

    基本描述

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

    1. 先手不能再第一次把所有石子取完;
    2. 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间,包括1和对手取的石子数的2倍。 
      取最后石子的人为赢家。

    结论

    先说结论: 
    当且仅当n不是Fibonacci数时,先手必胜。换句话说,先手必败构成Fibonacci数列。

    分析

    证明需要前置技能,“Zeckendorf定理”(齐肯多夫定理),其表述为:任何正整数可以表示为若干个不连续的Fibonacci数之和。

    具体证明在这篇博文中给出,有兴趣的读者可以自行学习。

    例题

    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
    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <queue>
    using namespace std;
    int main()
    {
        int fib[60];
        fib[0]=fib[1]=1;
        for(int i=2;i<=55;++i)
            fib[i]=fib[i-1]+fib[i-2];
        int n;
        while(scanf("%d",&n)!=EOF && n)
        {
            bool flag=true;
            for(int i=0;i<=55;++i)
            {
                if(fib[i]==n)
                {
                    flag=false;
                    break;
                }
            }
            if(flag)
                printf("First win
    ");
            else
                printf("Second win
    ");
        }
        return 0;
    }
  • 相关阅读:
    C# Redis实战(五)
    C# Redis实战(四)
    C# Redis实战(三)
    C# Redis实战(二)
    C# Redis实战(一)
    memcached的基本命令(安装、卸载、启动、配置相关)
    git和tortoisegit安装教程
    编程规范是非常重要的,为什么说可读性比什么都重要?你有没有确定一个编程规范呢?
    关于VR游戏的前景
    在项目开发过程中如何处理人际关系
  • 原文地址:https://www.cnblogs.com/aerer/p/9930997.html
Copyright © 2011-2022 走看看