首页 > 其他分享 >博弈练习

博弈练习

时间:2023-06-07 16:24:09浏览次数:31  
标签:lfloor 博弈 dfrac 练习 rfloor 必胜 如果 SG

博弈练习

理论后面再补吧

[省选联考 2023] 过河卒

我们将其局面抽象为一张图,然后不难发现没有环的情况我们直接\(dfs\)就可以了

如果有环的话,其对应的应该就是\(Tie\)的情况,具体的就是如果我们在访问\(x\)的祖先时\(x\)就可以达成死循环的局面,但这个不好维护

反过来考虑,我们直接对可以直接判断的局面作为起始节点跑个类似于拓扑的结构

如果是\(u\)必败,\(v\)则为必胜,\(u\)必胜,我们记录\(v\)还可以转移的边,如果没了\(v\)就是必败

最后没访问到的就是\(Tie\)

有点卡常

[POI1999]多边形之战

降智题

这个多边形的每条边作为无向图上的每条边,然后你会发现操作就是删除叶子节点

如果黑色的就是叶子先手必胜

否则俩个人一定要删\(n-1\)(\(n\)是树的节点数)次,直接\(\&1\)即可

BZOJ3895

如果没有大小为\(1\)的石子堆,理论上我们可以操作的次数是\(Sum+n-1\)

如果\(Sum+n-1\)是奇数,\(A\)一定有办法使其一直为奇数,因为每次\(Sum+n-1\)都只\(-1\)

且\(A\)一定会避免出现\(1\)的石子堆

对于\(Sum+n-1\)为偶数,其实也差不多,\(A\)因为先手所以无法改变,因此\(B\)必胜

如果出现了\(1\)的石子堆,取\(1\)这个石子堆会使\(Sum+n-1\)一次\(-2\)

如果有一个\(1\),\(A\)可以选择\(-1\)或\(-2\),因此\(A\)必胜

如果有两个\(1\),如果\(A\)本就必胜,\(A\)可以将两个\(1\)和在一起

如果必败,\(A\)无论怎样操作,\(B\)同样可以操作回来

因此可以分\(1\)的奇偶

如果全是\(1\),或者一个\(2\)和全部\(1\),只有当\(1\)的个数是\(3\)的倍数是\(B\)才可能赢

谁能赢呢?

\(n\)是偶数是必胜

如果没封口,以上易证

考虑封口的情况,如果是\(A\)决定往哪边封口

则现在已经有奇数个格子

如果一口是偶数,\(n\)是偶数,另一口是奇数则\(A\)可以往奇数的那边跑

如果一口是奇数,一样的

如果\(n\)是奇数,那两口都是偶或奇,如果是奇\(A\)就赢了?

好像\(B\)可以避免这种情况,在封口前延迟封口即可

本质是在二分图上博弈,结论是当最大匹配包含\(S\)时先手必胜

[ZJOI2009]染色游戏

首先对于这些翻棋子的游戏,都有个结论,局面的\(SG\)为所有正面棋子单独存在的\(SG\)的异或和

对于单个棋子\((i,j)\)的异或和,分类讨论一下

如果\(i=1\)或\(j=1\),考虑另一维所处位置\(x\),结论是\(SG(x)=lowbit(x)\)

考虑归纳证明,如果\([1,2^k-1]\)满足

对于\(x\in[2^k,2^{k+1}-1]\),往后依次延伸,你取到\(x-2^{k}\)的时候,恰好和\(x-2^{k}\)往后取是一样的,然后你还会发现这一段\(SG\)的异或和为\(0\),因此\(SG(x)=SG(x-2^k)\)

我们对于每个\(x\)一次减去它的最高位,最后剩下的就是\(lowbit(x)\)

如果\(i,j\)均不为\(1\),\(SG(i,j)=2^{i+j-2}\)

同样考虑归纳证明

如果\((i-1,j)\),\((i,j-1)\)均满足条件

对于\((i,j)\),首先\((i-1,j)\)出发的点能取到的\(SG\in[0,2^{k}-1]\),再异或一个\(2^k\)

也就取到了\([2^{k},2^{k+1}]\),如果再取\((i,j-1)\),那有可以取\([0,2^{k}-1]\)

因此\((i,j)\)能取到\([0,2^{k+1}]\)

最后用\(bitset\)算即可

「BZOJ1457」棋盘游戏

这个就有点类似与\(SG\),不过胜利条件改为第一次到达\((0,0)\)

如果有可以一步到达的那\(A\) 必胜

否则两个人一定会把棋子堆到\((2,1)\)或\((1,2)\),这样就转化为不能挪动的输,直接\(SG\)求即可

Moving Pebbles

首先如果\(n\)为偶数且数量相等的堆一一对应,我们直接模仿就行了,先手必输

这里我们排个序然后把能配对的删去

剩下的如果\(n\)时奇数,我们把先手最大的取完,然后移动去填\(2i-1\)和\(2i\)的差,可以证明填完一定有剩余,因为最大的等于差分的前缀和加上第一个

如果\(n\)时偶数,一样的,把最大的移到和最小的相等,然后再用多余的填差分,这样也一定时够的

[SDOI2011]黑白棋

很明显每对黑白棋子之间可以看成一个\(Nim\)堆

然后这就是可\(K-NIM\)游戏,结论是每个二进制为为\(K+1\)的倍数时后手必胜

然后直接对位\(Dp\)即可

[HAOI2015]数组游戏

注意到\(\lfloor\dfrac{n}{x}\rfloor\)相同的\(x\)的\(SG\)是相同的

因为\(\lfloor\dfrac{n}{xk}\rfloor=\lfloor\dfrac{\lfloor\dfrac{n}{x}\rfloor}{k}\rfloor\)

考虑直接对\(n\)整除分块,然后块于块之间,我们考虑从后往前考虑直接前缀\(SG\)然后取\(MEX\)

对于块\(\lfloor\dfrac{n}{x}\rfloor\),\(\lfloor\dfrac{\lfloor\dfrac{n}{x}\rfloor}{k}\rfloor\)同样可以整除分块,然后预处理出所有块的\(SG\)即可

有点卡常

CF98E

先手为\(0\),那他一定会直接猜,如果后手为\(0\),那先手就赢了

如果现在有状态\((n,m)\),他现在有两种选择

一是直接猜,赢的概率是\(\dfrac{1}{m+1}\)

二是指定一张,我们暂时不考虑指定自己已有的牌,那就有\(\dfrac{1}{m+1}\)输,有\(\dfrac{m}{m+1}(1-(m-1,n))\)的概率赢

小丑了,可能可以指定自己的牌从而达到欺骗的作用

对于这种情况,我们不妨考虑如果\(B\)不傻,那\(A\)的欺骗等同于告诉\(B\)自己的手牌

还有一点很麻烦,如果\(A\)或\(B\)在不清楚桌上的牌时直接猜怎么办

似乎这样做一定不优,额,证明就算了吧,感觉有点牵强

因为两者一定不会不清楚情况直接猜,所以对于\(B\),一定是在是否信任\(A\)的情况下进行猜测

我们可以据此列出一个\(A,B\)决策不同时\(A\)的胜率\(f(n,m)\)的表格

不出手牌 出手牌
中了\(B\) \(1-f(m-1,n)\)
没中\(B\)不信 1 \(1-f(m,n-1)\)(因为在\(B\)的视角中\(A\)的牌减少了)
没中\(B\)信 0 1

然后对于\(A\),\(B\),我们分别设\(p,q\)为出手牌,是否信任的决策频率,这个\(p,q\)是可以随时调整的?不过对于混合策略,我们姑且认为\(A,B\)有\(p,q\)的概率做出对应决策

由此\(A\)的胜率即为\(g(n,m,p,q)=(1-p)[\dfrac{m}{m+1}(1-f(m-1,n))+\dfrac{1}{m+1}(1-q)]+p[(1-p)(1-f(m,n-1))+q]\)

观察这个式子,对于\(A,B\)可以调整\(p,q\)使得自己的收益最大,这就形成了一个纳什均衡,也就是当一个人的固定时,另一个人的策略也是固定???

反正答案\(f(n,m)=Min_{q=0}(Max_{p=0}g(n,m,p,q))\)

然后考虑固定\(q\),\(g(n,m,p,q)\)是个关于\(p\)的一次函数,所以它的\(Max\)是在端点\(p=0,1\)时取得

我们画出\(p=0,p=1\)的函数,其实也就是关于\(q\)的一次函数

\(p=0,\dfrac{m}{m+1}(1-f(m-1,n))+\dfrac{1}{m+1}(1-q)\)

\(p=1\),\((1-q)(1-f(m,n-1))+q\)

观察到\(p=0\)时斜率小于\(0\),\(p=1\)时斜率就是\(f(m,n-1)>0\),所以最后的答案就是函数的交点,我们只需对于每个\((n,m)\)解出\(q\)即可

标签:lfloor,博弈,dfrac,练习,rfloor,必胜,如果,SG
From: https://www.cnblogs.com/kid-magic/p/17458967.html

相关文章

  • 【python练习】排列
    题目给定一个整数n,将数字1∼n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。代码n=int(input())path=[0foriinrange(n)]used=[Falseforiinrange(n)]de......
  • [linux]记录一次C语言综合练习
    题目根据特定功能设计程序,要求由main.c,Fun1.c-Fun3.c选择其中任意两个,共三个C语言文件和1个头文件组成,其中fun1.c,fun2.c和fun3.c都使用了define.h中的声明,C语言文件的功能分别是:fun1.c:输出9*9口诀fun2.c:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?......
  • Java-Day-27( Properties 类 + 章节练习 )
    Java-Day-27Properties类程序读取xx.properties配置文件,修改的话就通过配置文件将信息写入到程序(非写死在程序中,灵活性差,编译代价大)传统方法:publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{//传统方法//读取db.......
  • 爬虫的一些练习
    importrequestsfromretryingimportretry#设置重试次数和超时时间retry_times=3timeout=0.2#重试装饰器@retry(stop_max_attempt_number=retry_times,wait_fixed=timeout*10)defget_url(url):response=requests.get(url=url,timeout=timeout)pr......
  • 小汽车练习
    drf管理员,用户,车,车厂,经销商接口实现1有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表,一个车厂可以生产多种车型,一个经销商可以出售多种车型,一个车型可以有多个经销商出售车型:车型名,车型出厂价,车厂id车厂:车厂名,车厂地址,联系电话经销商:经销商名,地址,联系电话2有......
  • 阅读总结《刻意练习》
    总体来讲,没有多大帮助。也没完全总结完6/10,没有完全看完5/6。但是意思就是以下了。反反复复说的内容。不同专业领域的技能获得的时间与练习时间并不存在一个1万小时的最低阈值。天赋虽然在其中不起决定性作用,却也会是一大影响因子。练习的成果并不与时间成正比,这一点也取决于练......
  • python练习-简单计算器
    #*_*coding:utf8*_*#简单计算器importtkinterfromfunctoolsimportpartial#按钮输入调用defget_input(entry1,argu):#从entry窗口展示中获取输入的内容input_data=entry1.get()#合法运算符:+-*/--**//+-#------------输入合法性判断的......
  • Redis(二) -- 练习
    模拟手机验证码需求:使用redis模拟手机验证码发送,验证码有效期60s,验证验证码输入不能超过3次,超过3次今天就没机会了//验证手机号/***判断字符串是否符合手机号码格式*移动号段:134135136137138139147148150151152157158159165172178182183184187......
  • 微积分续期末练习
    期末练习DA解:\(f(x)=\frac{x-x^3}{\sin\pix}\),则\(f(x)\)的定义域为\(\mathbb{R}-\mathbb{Z}\),因此\(x\in0,\pm1,\pm2,\cdots\)都是\(f(x)\)的间断点,其中\(x=0\)为可去间断点,因为\[\lim\limits_{x\to0}\frac{x-x^3}{\sin\pix}=\lim\limits_{x\to0......
  • 开发环境搭建/练习环境搭建
    安装jdk和mvn首先看下是否安装:mvn\java用命令:mvn-v回车查看maven是否安装(我这是已经装了)没装的话是这样式儿的用命令java查看jdk是否安装(我这还是已经装了)没装是这样式儿的没装的话,去安装,首先双击jdk,点下一步进行操作即可安装之后,打开环境变量配置文档右键此电脑-属性点击高级系......