10.11 博弈论之抢夺安排最后一名同学进校
一开始解决这道题的时候很费解,想了一些办法发现都是无从下手,最后看到一位大佬写的有关博弈论的博客,突然顿悟。以下是题目内容
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通