一开始解决这道题的时候很费解,想了一些办法发现都是无从下手,最后看到一位大佬写的有关博弈论的博客,突然顿悟。以下是题目内容
std的国庆节结束了,由于疫情,校长决定让同学们分批进校。
至于每批学生来多少人由小蒲和小池负责,两个人轮番负责,需要所有人都可以进校,小蒲学长不想被别人嘲笑自己笨,小池要证明自己比小蒲学长强。所以他们会去争抢安排最后一名同学。
每次安排进校的同学数至少为1,至多为上一次进校的2倍。(请注意第一次安排不能直接安排所有的同学一起回校)。
小池抢到了先手的机会。
请问在两人均操作最优的情况下谁能安排最后一名同学入校。
输入格式:
输入一个整数n,n为需要回学校的同学总数。
输出格式:
如果是小蒲获胜就输出cxk ,小池获胜则输出xhz
输入样例:
3
输出样例:
在这里给出相应的输出。例如:
cxk
样例解释
可以发现小池第一次安排1 个同学或者安排2个同学之后小蒲均可安排最后一个同学返校,因此小蒲会获胜,所以输出cxk即可。
数据范围及约定
2≤n≤1×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; }
标签:同学,安排,博弈论,long,小池,进校,10.11 From: https://www.cnblogs.com/luoqingci/p/17763520.html