随笔分类 -  博弈

摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536只要构造好SG函数就行:AC代码:#include<iostream>using namespace std;#include<string.h>int a[110],k; //k为全局变量int sg[10010],flag[110];void SG() //SG函数{ int i,j; for(i=0;i<=10000;i++) { memset(flag,0,sizeof(flag)); for(j=0;j<k;j++) ... 阅读全文
posted @ 2012-04-21 23:49 龙杉老师
摘要:^^^转载请注明出处~~~The Sprague-Grundy theory of impartial games公平游戏的Sprague-Grundy定理公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法操作对双方来说都是相同的。一个公平游戏可以抽象地用一个有向无环图来表示,这个图中每个点都对应这一个状态,每条有向边代表从一个状态到另一个状态的合法操作。我们可以想象一个代币最初放在某个点上,然后两个玩家轮流将其从当前的点移动到它的后继点。当代币移动到汇点时游戏结束,汇点是一个没有出度的点,最后一个需要操作的玩家就是胜者。P- 和 N-状态如果双方都按照最佳策略进行游 阅读全文
posted @ 2012-04-21 09:58 龙杉老师
摘要:甲乙两人面对若干排石子,其中每一排石子的数目可以任意确定。例如图所示的初始局面:共n=3排,其中第一排的石子数a1=7,第二排石子数a2=3,第三排石子数a3=3。两人轮流按下列规则取走一些石子,游戏的规则如下:每一步必须从某一排中取走两枚石子;这两枚石子必须是紧紧挨着的;如果谁无法按规则取子,谁就是输家。 解:用符号#S,表示局面S所对应的二进制数。用符号$(x),表示局面(x)的下一步所有可能出现的局面的集合。定义集合g(x):设$(x)={S1, S2, …, Sk},则g(x)={#S1, #S2, …, #Sk}。函数f满足要求的一个充分条件f(a1)不属于集合g... 阅读全文
posted @ 2012-04-20 20:06 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~Be the WinnerLet's consider m apples divided into n groups. Each group contains no more than 100 apples, arranged in a line. You can take any number of consecutive apples at one time.For example "@@@" can be turned into "@@" or "@" or "@ 阅读全文
posted @ 2012-04-17 08:53 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~JohnProblem DescriptionLittle John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that 阅读全文
posted @ 2012-04-17 00:13 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~取石子游戏 Problem Description1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".Input输入有多组.每组第1行是2<=n<2^31. n=0退出.Output先取者负输出"Second win". 先取者胜输出"First win".参看Sample Output.Sample Input 阅读全文
posted @ 2012-04-16 23:24 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~取(2堆)石子游戏Problem Description有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你胜,你第1次怎样取子?Input输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,且a<=b。a=b=0退出。 阅读全文
posted @ 2012-04-15 20:21 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~Problem Descriptionm堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取时可以从有8个的那一堆取走7个剩下1个,也可以从有9个的中那一堆取走9个剩下0个,也可以从有10个的中那一堆取走7个剩下3个.Input输入有多组.每组第1行是m,m<=200000. 后面m个非零正整数.m=0退出.Output先取者负输出No.先取者胜输出Yes,然后输出先取者第1次取子的所有方法.如果从有a个石子的堆中取若干个后剩下b个后会胜就 阅读全文
posted @ 2012-04-15 11:07 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~取石子游戏Problem Description有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。Input输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。Output输出对应也有若干行,每行包含一个数字1或0,如果最 阅读全文
posted @ 2012-04-15 00:25 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~博弈论总结有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s, 阅读全文
posted @ 2012-04-14 21:40 龙杉老师
摘要:先来看一个例子,即赌徒输光问题:赌徒甲有资本a元,赌徒乙有资本b元,两人进行赌博,每赌一局输者给赢者1元,没有和局,直赌至两人中有一人输光为止。设在每一局中,甲获胜的概率为p,乙获胜的概率为q=1-p,求甲先输光的概率。 解:先设c=a+b; r=q/p;这个实际上是Markov过程(马尔科夫过程),具体细节不说了,结果就是:HDU1204 这道糖果大战,也是这类题目,下面是自己的AC代码:#include<stdio.h>#include<math.h>#define M 1e-12int main(){ double p,q,s,r; int a,b; while. 阅读全文
posted @ 2012-03-08 11:14 龙杉老师