• HDU 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

    分析

    先取的人:A  后取的人:B

    2个石子时:A肯定输,B胜。

    3个石子时:A取1个或者两个,还是输,B胜。

    4个石子时:A可以在第一次取1个石子取胜,A胜。

    5个石子时:A第一次取1个,然后B完全可以只取1个,让局面变成3个石子的情形,B胜;A第一次取2个,B胜。

    6个石子时:A第一次取1个,然后B再取1个,局面就变成4个石子的情形,A胜,如果B取2个,只剩下3个A可以取完,A胜。

    7个石子时:A第一次取2个,然后B再取1个,剩下4个石子的情形,A胜,如果B取2个或者3个或者4个,剩下的A都可以可以一次取完,A胜。

    8个石子时:A第一次取1个,B可以取2个,剩下5个石子的局面,B胜;A第一次取2个,B可以去1个,剩下还是5个石子,B胜;A第一次取3个,B可以取完,B胜。

    以此类推,可以发现当石子的个数是斐波那契数列中的数时B都可以取胜,否则A可以取胜。

    #include<iostream>
    using namespace std;
    
    int main()
    {                        //2^31 =2147483648
        long long int a[45];//a[44]=2971215073
        a[0]=2,a[1]=3;        
        long long int n;
        for(int i=2;i<45;i++)
            a[i]=a[i-1]+a[i-2];
        while(cin>>n && n!=0)
        {
            int i;
            for(i=0;i<45;i++)
                if(n==a[i])
                     break;
            if(i>44)
                cout<<"First win"<<endl;
            else
                cout<<"Second win"<<endl;
        }
        return 0;
     } 
  • 相关阅读:
    springboot笔记(五章)整合持久层技术
    Java基础复习(一)
    springboot复习
    JUC(2)
    JUC(1)
    springboot笔记(一~四章)入门、基础配置、整合视图技术、整合Web开发
    JVM复习
    NIO(New IO)
    hive 函数
    hive基础知识
  • 原文地址:https://www.cnblogs.com/wixy/p/5350559.html
Copyright © 2020-2023  润新知