摘要:
简单博弈问题(巴什博弈-Bash Game)巴什博弈:只有一堆n个物品,两个人轮流从这对物品中取物,规定每次至少取一个,最多取m个,最后取光着得胜。很容易想到当n%(m+1)!=0时,先取者必胜,第一次先拿走n%(m+1)个,以后每个回合都保持两人拿走的物品总和为m+1即可。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报10个,谁能报到100者胜。此题可以把每堆石头的取法看作是一个BashGame,这样只需将每组石头按照BashGame的取法判断,然后将n堆石头做异或,如果异或的结果不为0,则老师获胜,否则Agrael取胜。代码如下: 1 #include 2 #inc 阅读全文
posted @ 2013-08-11 16:03
_随心所欲_
阅读(276)
评论(0)
推荐(0)
摘要:
那么对于这题对于每一堆,放石子放满就想当于满的时候取s-c个,反向只是让我理解题意更深。首先我们知道(S,S)这个局面是必败局面。对于每一堆能加的数量有限,而当c的值(大于或者等于)D=sqrt(s) 或者 D=sqri(s)+1的时候就可以一次完成,就是说可以从当前局面到达(S,S)的局面,所以当前局面是必胜局面。而这种情况下,你能造成的局面有集合A={0,1,2,...,s-c-1};因为你可以去s-c,s-c-1,s-c-2,.....,1;那么对应mex(x)函数(即A中未出现的最小的一个数字),那么自然该局面的SG值就是s-c了;另外当c的值小于D的时候,是不可能一下子加满的,因为c 阅读全文
posted @ 2013-08-11 15:50
_随心所欲_
阅读(270)
评论(0)
推荐(0)
摘要:
水题,转化Nim代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int m,t,ans;13 int main(){14 while(scanf("%d",&m)&&m){15 ans=0;16 while(m--){17 scanf("... 阅读全文
posted @ 2013-08-11 15:15
_随心所欲_
阅读(153)
评论(0)
推荐(0)
摘要:
很简单的博弈论问题,可以转化为Nim代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int n,m,t,j,ans;13 int main(){14 while(scanf("%d%d",&n,&m)!=EOF){15 ans=0;16 for(int i=0;.. 阅读全文
posted @ 2013-08-11 15:09
_随心所欲_
阅读(338)
评论(0)
推荐(1)
摘要:
找sg值,可以选择暴力,也可以利用sg值的特点简化。暴力就跟取石子一样,没什么差别,DFS搞定。把矩阵看成一个字符串,字符串就是一个状态。其实我们也可以不暴力求sg值,因为只要当前状态能到达一个sg值为0的点,当前状态就是必胜点。若当前点到达的所有状态都是必胜的,那么当前点就是必败点。所以当我们到达必胜点时,就必须转换当前状态继续递归找sg值。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0) 阅读全文
posted @ 2013-08-11 14:55
_随心所欲_
阅读(262)
评论(0)
推荐(0)

浙公网安备 33010602011771号