随笔分类 -  acm 博弈

hdu 3980 Paint Chain (sg)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3980 求sg值。 一开始被第二个样例卡住了,读了好几遍题才发现它初始是个环。 这样就可以先把它变成链,然后在链上枚举取m个连续点,每次都可以将这条链分成两部分,相当于两个子游戏。对于一个链,一共有n-m-i个子游戏对,用vis数组标记好这些子游戏对的异或值,最后就可以找出sg[n]。 这算是我做的第三种类型求sg值的题吧。code:#include<cstdio>#include<cstring>intsg[1001],m;intmex(intn){if(sg[n]!=-1)retu 阅读全文
posted @ 2012-05-05 11:03 追逐. 阅读(364) 评论(0) 推荐(0)
hdu 1536 S-Nim (sg)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1536 计算sg值。 注意两个地方: 1. s是无序的。 2. 不能对n=10000打表,因为能取的个数是给定的,会有打不到的点。code:#include<cstdio>#include<cstring>ints[101],sg[10001],k;intmex(intn){if(sg[n]!=-1)returnsg[n];boolvis[101];//n最多有100个后继inti;memset(vis,false,sizeof(vis));for(i=0;i<k;i++){if 阅读全文
posted @ 2012-05-04 20:10 追逐. 阅读(260) 评论(0) 推荐(0)
hdu 1847 Good Luck in CET-4 Everybody! (sg)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1847 和toj1180完全一样的题。 用sg函数写一下。将1000内的sg值打表即可。code:/*#include<cstdio>intmain(){intn;while(~scanf("%d",&n)){if(n%3)printf("Kiki\n");elseprintf("Cici\n");}return0;}*/#include<cstdio>#include<cstring>intsg[1001 阅读全文
posted @ 2012-05-04 11:01 追逐. 阅读(203) 评论(0) 推荐(0)
hdu 1907 John (Nim变形)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1907 Nim的变形,最后取为败,详见http://www.cnblogs.com/tanky_woo/archive/2010/08/20/1804464.html中取火柴游戏2。 这里总结下结论: 1. 当所有堆个数都为1时,若为奇数堆,即异或不为0,则先手败,反之先手胜。 2. 非所有堆个数都为1时,则异或不为0先手胜。 用上述博文中的定义则为T0, S1, S2为必胜态,T1, S0为必败态。code:#include<cstdio>intmain(){intt,n,f,i,a,sum;s 阅读全文
posted @ 2012-05-04 10:02 追逐. 阅读(291) 评论(0) 推荐(0)
poj 1704 Georgia ans Bob (Staircase-Nim)
摘要:http://poj.org/problem?id=1704 把数组倒置(17 14 12 9 7 6 5 1),将相邻棋子的间距视为一堆石子(2 1 2 0 0 3),那么题中所给操作即为把后一堆石子中的n个放到前一堆石子中,这样就转化为了阶梯博弈。用阶梯博弈的解法直接奇位异或就ok了。 在其他博客里还看到一种解法,从后向前两两分组,奇数个点则在最前加一个0结点。把两个结点间的间距看作一堆石子。 1.若对手移动两个中的前一个,那么后一个一定可以移动同样多的位置 2. 若对手移动两个中的后一个,那么等同于从这堆石子中拿出n个 这不就是阶梯博弈么?对偶数堆的操作可以忽视,奇数堆异或即为解。干.. 阅读全文
posted @ 2012-05-04 09:46 追逐. 阅读(242) 评论(0) 推荐(0)
hdu 1850 Being a Good Boy in Spring Festival (Nim)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1850 Nim博弈,求保证先手必胜可选的方案数。 对于一个必胜的局面,至少有一个方案可以到达必败局面。也就是说,对于a1^a2..^an!=0一定有一个ai可以改为ai',且a1^a2..^ai'..^an==0。设a1^a2..^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(因为k的最高位为1),那么有ai^k<ai成立。则a1^a2..^an^k=0,可得ai'=ai^k。 题意找有多少种先手必胜的方案,枚举ai,统计满足ai^k<ai的个数即可。co 阅读全文
posted @ 2012-04-29 20:51 追逐. 阅读(209) 评论(0) 推荐(0)
toj 1180 Stone Game
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1180 简单推理博弈。观察每次要取的个数,1,2,4,8,16...,对3的余数分别为1,2,1,2,1...,也就是说,没有可能只用一次操作从一个3的倍数达到另一个3的倍数。 当n=3时,显然先手必胜,那么先手只要在第一次操作上使剩余石子个数为3的倍数即可。这里先手必败的情况只有一种,即n%3==0。 如何求n%3?一个貌似初中或小学就学过的但是大多数人都忘记的东西:对一个数的每一位累加,结果对3的余数与n对3的余数相同。code:#include<cstdio>intmain() 阅读全文
posted @ 2012-04-27 22:18 追逐. 阅读(237) 评论(0) 推荐(0)