博弈论
参考资料
简介
博弈论(game theory)是经济学的一个分支,主要研究具有竞争或对抗性质的个体,在特定规则下所产生的各种行为。博弈论关注博弈中个体的预期行为与实际行为,并研究其最优策略。
通俗地讲,博弈论主要研究的是:在一个游戏中,进行游戏的多位玩家如何选择策略。
例题
洛谷 P2197 【模板】Nim 游戏
甲,乙两个人玩 nim 取石子游戏。
nim 游戏的规则是这样的:地上有 堆石子(每堆石子数量小于 ),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 堆石子的数量,他想知道是否存在先手必胜的策略。
代码(1)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
sum^=t;
}
cout<<(sum==0?"No":"Yes")<<'\n';
}
return 0;
}
洛谷 P2252 【模板】威佐夫博弈 / [SHOI2002] 取石子游戏
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法:一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
代码(1)
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using ld=long double;
const ld phi=(sqrt(ld(5))+1)/2;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll a,b;
cin>>a>>b;
if(a>b)swap(a,b);
cout<<(a!=ll((b-a)*phi))<<'\n';
return 0;
}