zoukankan      html  css  js  c++  java
  • 斐波那契博弈

    题目描述  来源:牛客网

        幼儿园开学了,为了让小盆友们能尽可能的多的享受假期。校长大人决定让小盆友分批到校,至于每批学生来多少人由一个小傻子和一个小仙女负责,两个人轮番负责,校长会在最后的时候去查看工作进度,小傻子不想被别人嘲笑自己傻,小仙女要证明自己比小傻子聪明。所以她们回去争抢安排最后一名小盆友。每次安排的小盆友至少为1,至多为上一次安排的2倍。小仙女抢到了先手的机会。第一次安排小盆友不能直接安排所有的小盆友一起回校。

    输入描述:

    单组测试数据
    输入一个整数n——n代表小盆的个数(n>=2&&n<=1e9)

    输出描述:

    输出获胜人的名字——“Xian”或者“Sha”
    示例1

    输入

    3

    输出

    Sha

    说明

    (Fisrt)1 -> (Second)  2         ||     2 - > 1  无论小仙女先送一个还是两个都会被小傻子获胜
    示例2

    输入

    4

    输出

    Xian

    说明

    1 -> 2 -> 1    ||    1 -> 1 -> 2        小仙女先送一个,小傻子无论送一个或者两个都会被小仙女取胜。



    思路:
    刚开始列出了1到8的情况,想通过找规律加分析,找出公式,却没想到这题的规律这么复杂
    总结:
    这种题目靠积累,做过的人三分钟解决,没做过的人三年也想不出来啊
    如果n属于斐波那契数列,那么后手胜利。
    #include <iostream>  
    #include <string.h>  
    #include <stdio.h>  
      
    using namespace std;  
    const int N = 55;  
      
    int f[N];  
      
    void Init()  
    {  
        f[0] = f[1] = 1;  
        for(int i=2;i<N;i++)  
            f[i] = f[i-1] + f[i-2];  
    }  
      
    int main()  
    {  
        Init();  
        int n;  
        while(cin>>n)  
        {  
            if(n == 0) break;  
            bool flag = 0;  
            for(int i=0;i<N;i++)  
            {  
                if(f[i] == n)  
                {  
                    flag = 1;  
                    break;  
                }  
            }  
            if(flag) puts("Sha");  
            else     puts("Xian");  
        }  
        return 0;  
    }  
  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/carcar/p/8482249.html
Copyright © 2011-2022 走看看