10.11 博弈论之抢夺安排最后一名同学进校

发布时间 2023-10-13 23:27:16作者: liuxuechao

一开始解决这道题的时候很费解,想了一些办法发现都是无从下手,最后看到一位大佬写的有关博弈论的博客,突然顿悟。以下是题目内容

std的国庆节结束了,由于疫情,校长决定让同学们分批进校。

​ 至于每批学生来多少人由小蒲和小池负责,两个人轮番负责,需要所有人都可以进校,小蒲学长不想被别人嘲笑自己笨,小池要证明自己比小蒲学长强。所以他们会去争抢安排最后一名同学。

​ 每次安排进校的同学数至少为1,至多为上一次进校的2倍。(请注意第一次安排不能直接安排所有的同学一起回校)。

​ 小池抢到了先手的机会。

​ 请问在两人均操作最优的情况下谁能安排最后一名同学入校。

输入格式:

输入一个整数n,n为需要回学校的同学总数。

输出格式:

如果是小蒲获胜就输出cxk ,小池获胜则输出xhz

输入样例:

3

输出样例:

在这里给出相应的输出。例如:

cxk

样例解释

可以发现小池第一次安排1 个同学或者安排2个同学之后小蒲均可安排最后一个同学返校,因此小蒲会获胜,所以输出cxk即可。

数据范围及约定

2n1×109

这个绞尽脑汁的问题仅仅用了以下这个简短的代码就完成了,仅仅需要判断这个学生数是否为斐波那契数列里的数就可以了。至于这道题的关键 :博弈论

可以去搜一下博弈论讲解(巴什博弈,尼姆博弈,威佐夫博弈,斐波那博弈,SG定理),这里就不做讲解了,毕竟我也是参考学习别人的博客

#include<iostream>
using namespace std;
int main()
{
    long long int n;
    cin >> n;
    long long int sum1=1,sum2=1,sum=0;
    while (sum <= n)
    {
        if (sum == n)
        {
            cout << "cxk";
            break;
        }
        sum = sum1 + sum2;
        sum1 = sum2;
        sum2 = sum;
    }
    while (sum > n)
    {
        cout << "xhz";
        break;
    }
    return 0;
}