博弈论记录
一次刷题中遇到了博弈论的题型,由此展开了一个新世界,特此记录一下:
2021-1-31
参考博客:https://www.cnblogs.com/Khada-Jhin/p/9609561.html
--------------------------------------博客更新线嘻嘻(●'◡'●)-----------------------------------------------
巴什博弈
有两个十分聪明的人进行博弈,有一堆石子n个,每个回合双方必须取走[1,m]个石子,最终谁没有石头可拿,谁就获胜。
那么我们可以推知:
1、当n<=m,先手可以直接拿完,先手必胜。
2、当n=m+1时,无论先手如何挣扎(只拿一个还是选择拿m个),后手都能一次取完。
3、当n=(m+1)*k时,k为任意非负整数,先手无论如何挣扎,后手都可以只拿m+1-(先手拿的数量),使石子保持为(k-1)*(m+1)的数量,这样后手必能最后一个拿完石子,后手必胜。(当k==0时,后手也是必胜,因为先手没得取)
4、当n=(m+1)*k+x,x<m+1,先手必胜。因为先手先取走x个石子,这样无论后手如何取石子,先手只要和第三种情况一样保持石子数量就能获胜。
例题:
链接:https://ac.nowcoder.com/acm/contest/11746/D
来源:牛客网
题目描述
长达数日的春日祭终于告一段落,作为巫女的朝野芳乃在打扫完神社本决定好好享受一下久违的宁静。然而守护了神刀数百年的丛雨难耐寂寞,希望芳乃能陪她一起玩扑克消解愁闷。
芳乃并不擅长市井的游戏,所以总是输多赢少。而昨日被芳乃的神乐舞深深吸引,以致一早就前来建实神社希望能再睹芳华的你碰巧听见了此事。尽管不知道为什么美丽的巫女要自言自语地为玩扑克而苦恼,但你毅然决然地毛遂自荐,希望能为芳乃一解眉间愁。
芳乃告诉了你丛雨准备了n张扑克牌作为牌堆,每人每次至多从牌堆顶部抽k张牌,至少抽1张牌。牌堆底部的最后一张牌作为乌龟,抽中的将输掉这一轮比赛。芳乃想知道在你的帮助下,她和丛雨都采取积极策略时,她自己是否一定能获胜。作为被丛雨邀请的一方,每轮游戏都是芳乃先抽。
因为看不见丛雨而误认芳乃罹患精神分裂的你在不由感叹红颜薄命的同时,决定尽全力帮助芳乃完成她的委托。
声明:本题中的所有角色在剧情发生时均已超过18岁。
输入描述:
第一行包含一个整数T,表示共有T组测试数据。
每组测试数据共一行,包含两个正整数n和k,分别表示牌堆中有n张牌和每次抽取最多抽取k张。
数据保证T,n,k≤1000000。
输出描述:
对于每组测试数据给出一行结果。
如果芳乃必胜,则输出“yo xi no forever!”,
否则输出 ”ma la se mi no.1!“。
思路:题目是抽走最后一张牌的人输和巴什博弈不太一样,但是我们可以转换一下描述,即最先抽走乌龟上所有牌的人胜利,也就是将题目中给的n-1即可。
AC代码:
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
if(n<=k+1&&n>1)
printf("yo xi no forever!\n");
else if(n==k+1)
printf("ma la se mi no.1!\n");
else if(n%(k+1)!=0)
printf("yo xi no forever!\n");
else
printf("ma la se mi no.1!\n");
}
}
尼姆博弈
又是两个聪明的人博弈:有两堆石子,每轮每个人可以从任意一堆中抽取任意石子的数量或者在两堆石子拿走任意数量但必须相同数量的石子,不能拿走石子的人输,已知两堆石子各自的数量,孰胜败?
我们定义两堆石子的剩余数量x,y为局势,这里假设x<y,定义先手必败的局势为奇异局势,如果局势为(0,0),那说明先手必败;然后把x,y化成二维的直角坐标系,奇异局势的点标成红色的点,显然(0,0)是奇异局势的终点,其他坐标在玩家操作任意回合后最终会到达它。我们可以很容易知道前几个前几个奇异局势的点(1,2)、(3,5)、(4,7)……

而关于奇异局势的性质由伟大的前人和高手已经总结出来(真的很佩服这些呕心沥血热爱思考的人啊~):
对于第k个局势(k从0开始),x为前k-1个局势中未出现的最小自然数,y=x+k。
注意,这里的k-1个奇异局势是只包含x<y的,但是,当然,根据对称性,x和y值互换的胜负性是一样的,第一堆石头为1,第二堆石头为2肯定是和第一堆石头为2,第二堆石头为1是一样的(可以把1当成第一堆)。
而根据Betty定理,可以求得第k个奇异局势:((1+根号5)*k/2,(3+根号5)*k/2),因此你可以根据y=x+k,求出k,再由第k个奇异局势上对应的x和y来验证所得x和y是否为奇异局势;
后面分单个随笔写例题叭。

浙公网安备 33010602011771号