博弈论习题

vj题目汇总
一,
威佐夫博弈题解
(1)HDU 1527(入门)
(2) HDU 2177 (进阶1)
(3)51Nod 1185(进阶2)
注:进阶1中提处理了输出威佐夫博弈的第一种可行方案的问题;
进阶2处理了威佐夫博弈中(黄金比例*大数)精度会损失的问题;
补充:威佐夫博弈中,非奇异局势可以通过一步找到奇异局势。
二,
NimK(尼姆)博弈 :
k==1;
(1)HDU 1850 判断是否获胜,若第一个人获胜,输出他在第一次选择有几种不同的选择方案数;
(2)HDU 2176 ,和(1)类似,不同在于这道题输出获胜前提下,输出第一次之后的(a,b);
(3) HDU 1730 ,将棋盘上棋子的有效可行移动距离变为Nim中的石子问题,求解
(4)HDU 1849 ,同(3)
(5) POJ 2234 ,入门
(6) POJ 2975,同(1)
(7) ZOJ 3591 (ZOJ没了,无法提交,但是个入门题)
(8)51Nod 1069 ,入门
(9)51Nod 1661,()
k>1:
Football Game POJ - 2315
NIMk博弈的典型例题;
题目做法:
将题目给的最大的距离转化为最大的石子数k,注意将数据向下取整
将题目中给的每一个足球的目标距离,转化为石子的数目,向上取整;
问题就变成了:
n个石子堆,每次最多可以选择k个石子堆,每个石子堆最多可以取s个;
解题方法:统计出每一堆石子数a的每一位,最后对于每一为取余(k+1);(这里又把每一堆石子转化为每一个石子,采用了威佐夫博弈的思想)
这里为什么要取余(k+1)呢?
试想普通的每次只能从一堆石子里取时,我们采用的时异或操作,最后判断结构是否不为0;其实这样操作就等于堆每一位的和取余2,最后判断是否存在一位,取余后的结果为1;

3,sg函数
sg(x) 表示x这个局势的选择余地,x的值越大,选择余地越大,当x的值为0时,说明当前节点没有选择的余地,没有选择的余地,又有两种情况,1,当前节点的子节点的sg值,全大于0,无论该节点如何选择,都达不到奇异局势;2,当前节点没有选择,即无任何子节点。

对于使用sg函数的题,要理解sg函数的值扮演的角色。

为什么sg[x]0,说明该局是奇异局势,因为如果sg[x]0,说明x的任何一个子问题都不为0,所以sg[x]为0;如果函数sg[x]中存在为0的子问题,那么sg[x]不为0;因为sg[x]的子问题中存在奇异局势,说明x是非奇异局势。
(1)Fibonacci again and again HDU - 1848
打表sg函数;sg函数基本的模板
(2)Digital Deletions HDU - 1404
打表暴力sg函数;
由奇异局势的点去找到非奇异局势的点
(3)S-Nim HDU - 1536
sg函数+f数组,注意f数组里面的数据要进行从大到小的排序。
(4)Stone Game HDU - 1729
动态的变化,dfs找到满足要求的奇异局势点即可。
(4)A Multiplication Game HDU - 1517
dfs实现对sg函数的更新,数据为long long,采用map;
(5)Euclid’s Game HDU - 1525
采用(4)的思路,进行dfs更新,增加的pair来存储点的关系
(6)Play a game HDU - 1564
采用(4)的思路,进行dfs更新,但是有个问题,直接使用sg函数
的值来判断的话,会爆内存,但是我们可以发现一个规律,当n时偶数时前者获胜;但在这里面sg
1,表示的是奇异局势,而非 非奇异局势
(7)HDU1760
这道题使得我对dfs的理解进一步加深,我们dfs的目的是啥?
这个是我们写dfs之前要想好的,就想用dfs去写最短路的时候,
你得知道我们得目标是什么,而这道题得目标就是:
如果我们可以选择这个点,那么下一次选择是奇异局势,就是
没有可选择的地方,我们就可以认为这个点是非奇异局势,并返回sg
1;
否者如果这个点以后,所有的选择都是1,那么这个点是0;
(8)kiki’s game HDU - 2147
sg打表,如果n和m同时是质数,则先手败,否则先手获胜。
(9)Bomb Game HDU - 2873
二维sg函数,理解大问题分解之后的小问题是什么,要理解小问题如何递归到大问题,要理解sg函数代表着什么。
(10)Stone Game, Why are you always there? HDU - 2999
首先理解这个问题:
给你一个n,代表有n个选择(可能出现重复的选择)每个选择代表每次可以连续取多少个数,然后提供一个m, 代表下面将有m个数据k,每个数据k代表我目前有一条长度为k的石子,A,B轮流按照上面提供的规则取。

4,巴士博弈
(1)HDU - 2188 ,入门
(2)Brave Game HDU - 1846,入门
(3)Public Sale HDU - 2149,输出解决方案
//巴士博弈的第一步的解决方案:如果石子的数目m小于或等于每次放置的最大数目n,答案区间[m,n];如果m>n,答案只有m%(n+1);
总的来说,思想就是让对方在下一步无论如何操作达到奇异局势,而不是非奇异局势。
(4)Buttons POJ - 2368
对于给定的最大石子的数目n,求每次可以最大的获取数m并要求m>=2,使得第二个人获胜;
方法是判断n是否是素数,如果n是素数,那么m ==n-1;
如果n是不是素数,那么m是n的最小的满足大于2的因子(是大于2)
n%(m+1);
(5)
Bash游戏 V2 51Nod - 1067
打sg表发现规律
(6)Bash游戏 V3 51Nod - 1068
打sg表发现规律,注意题目中n要用字符串的形式存取,
n%3;等于n每一位上的数取余3再相加的和取余3;因为10%3 ==1
(7)邂逅明下 HDU - 2897 巴士博弈的变形
n个石子,最少可以取p个,最多可以取q个,如果少于p个,必须全部取,最后取石子的输;

这道题由巴士博弈的影子,先来思考一下巴士博弈是什么?
经典的巴士博弈,n 个石子,至少取1个,至多取m个,无石子可取的输。
我们的思路是:
n=(m+1)*r+s;
0<=s<=m;
当s==0时,即n%(m+1) 0;后手B获胜,获胜的方法是:每次先手A取a个。后手B都去(m+1-a)个石子,这样到最后先手A无石子可取;
当s>0时,先手A获胜,获胜的方法是A先去m个,这样问题就变成了s
0,B为先手的情况了。

那我们如果改变一下巴士博弈的规则呢,最后取石子的输,其余不变,那么又该如何获胜呢?
n=(m+1)*r+s;
0<=s<=m;
当s0时,先手A获胜,第一次取m个,(第一个m+1对还剩余1);(每当B取k个,A取(m+1-k)个),最后剩给B的是1个;
{这里是说从A开始维护,“(每当B取k个,A取(m+1-k)个)”,如果从B开始维护呢?A取k个,B取(m+1-k)个,只要A每次取m个,B最后还是回输}
当s
1时,后手B获胜,(第一次A取k个,B取m+1-k个),这样到最后还会剩余1个,那么A失败;
当s>1时,先手A获胜,A第一次取s-1个石子,那么局势就变成了上面的情况;

那么我们再讨论这个问题:
“n个石子,最少可以取p个,最多可以取q个,如果少于p个,必须全部取,最后取石子的输;”

那么p==1,不就是上面的情况了吗?

n=(p+q)*r+s;;
当s==0,A获胜,A取q个,(B取a个,A取p+q-a个),最后还剩p个留给B;
当0<s<=p,B获胜,(A取k个,B取p+q-k个),最后剩给A,s个;
当s>p时,A获胜,A取(s-p)个,这样局势就变成了,B先手,s == p 的局势了;
5,斐波那契博弈

(1)Bash游戏 V4 51Nod - 1070
一开始的思路是脱离题目本身的,去像Stone Game HDU - 1729这道题一样,去寻找分割点,但是这道题不存在这样的结果,试图去寻找规律,从样例中可以看出,几个答案满足斐波那契数列的规律,继续验证后面的数据,任然满足
(2)取石子游戏 HDU2576
打表,发现斐波那契数列的规律
6,对偶博弈
(1)
No Gambling HDU - 3863
水题,先手一定胜,因为每一次A的选择都是明确的,而,B的选择都是在A后面
,做出的补救措施。
(2)Coin Game HDU - 3951
先处理特殊情况,(1)k 1,n%2;(2)k>=n;(3)—;
第(3)中情况,后手B一定可以获胜,B可以一步获胜,亦可以制造
对称局势; 处于对称局势的先手一定失败
(3)A Funny Game POJ - 2484
寻找对称局势;
本题中当n == 1|| n
2时,先手A可以一次全部取出;
当n==3时,先手A无论是拿一个还是拿两个,后手B都可以在下一次取得胜利;
当n>=4时,先手A第一步之后,后手B可以落子形成对称局势。
(4)Plate Game CodeForces - 197A
判断长方形是否可以放下一个盘子,当且仅当放不下盘子,先手A会输;
如果可以放下n个盘子:
n ==1||n ==2时,A可以直接赢;
n>=3时,A合理的放置棋子,可以让后手B面临对称局势
率先面临对称局势的一定会输

6,组合博弈
(1)A Simple Game HDU - 1851
M堆石子,每堆最多取Li个,问后手获胜的情况;
每一堆满足巴士博弈,则通过这个计算出每一堆的sg值,0或者1,0表示该堆后手获胜,1表示该堆先手获胜;
M堆满足nim(尼姆)博弈,计算sg值得异或,若ans==0,说明对於单堆来说,先手获胜的局势和后手获胜的局势都为偶数,则后手可以形成对称局势;

反思:一开始只是取考虑先手获胜的有几局,如果是偶数,则对;否则错;
这是错误的,sg值才是每一组博弈的标志。
7,二进制里面的找规律的题
(1) Stone Game II+hdu 4388 二进制找规律
k<n;
如果 n^k<n;那么k<n;
如果n的二进制数101;
那么k只能是001,或者100;
就是将数字拆分之后1的个数减去n就是可以有几局这样的游戏,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章