04 2012 档案

摘要:刚开始这不知道思路,后来还是看了别人的解题报告才弄出来;集体思路:当前的箱子容量为si,那么要赢就要满足t + t*t < si现在箱子本来有ci:ci> t 则必胜;ci == t 则必败;ci < t不能断定输赢,那么就要继续调用SG函数;如果 ci > t SG值就是ci - t;因为剩下的容量只有这么大了;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include< 阅读全文
posted @ 2012-04-22 21:02 wutaoKeen 阅读(252) 评论(0) 推荐(0)
摘要:这是一道赤裸裸的SG函数的题目;View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int f[20]={1,1},sg[1024]; 8 void GetFa( ) 9 {10 for( int i = 2 ; i < 20 ; i ++ )11 {12 f[i] = f[i -1] + f[i - 2]; 13 阅读全文
posted @ 2012-04-21 20:15 wutaoKeen 阅读(271) 评论(0) 推荐(0)
摘要:这是一道典型的SG函数题;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 int s[124],sg[10024],n;12 int 阅读全文
posted @ 2012-04-21 16:33 wutaoKeen 阅读(172) 评论(0) 推荐(0)
摘要:只是一道取石子游戏的变形题,刚开始我想着去打表,一直打不出后来画图就一下子清楚了;我们来分析只有一行的情况:我们知道只要黑白棋子之间有空格,只要谁先走就一定谁赢,因为先走者一定会走到与两个棋子之间没有空格的地方,这样才能保证他赢,我们看成取石子且石子只有一堆的情况;那么多行时,我们就可以把两个棋子之间的空格看成有多少个石子,而行可以看成有多少堆,再利用Nim就可以解决问题了;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm 阅读全文
posted @ 2012-04-20 19:34 wutaoKeen 阅读(292) 评论(0) 推荐(0)
摘要:只是一道Nim题我们可以把他转化成堆就可以了,这个点在哪个地方就相当于这个地点有好多的石子,这样就可以了。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namesp 阅读全文
posted @ 2012-04-19 22:25 wutaoKeen 阅读(157) 评论(0) 推荐(0)
摘要:这个题我是打表出来的,达标代码如下:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 int d[3][2] = {0,-1,1,0, 阅读全文
posted @ 2012-04-19 22:04 wutaoKeen 阅读(126) 评论(0) 推荐(0)
摘要:这题我刚开始推出了n=1,2,3的情况,自己在大胆的猜测是奇偶性,发现A了;后来打表也是奇偶性质;打表代码:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 int n ; 4 int graph[1010][1010] ; 5 int tab[4][2] = {-1,0,1,0,0,-1,0,1} ; 6 int dfs (int x, int y) 7 { 8 int xx, yy, i, ans ; 9 for (i = 0 ; i < 4 ; i++) 10 { ... 阅读全文
posted @ 2012-04-19 20:40 wutaoKeen 阅读(223) 评论(0) 推荐(0)
摘要:这个题要找一下规律:我们假设1为必败点P,则2~9为必胜点,那么10~18又是必败点,19~162又为必胜点,163~324为必败点;必胜点为m*18^n(m<=9),必败点为m*18^n(m>9);View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #inclu 阅读全文
posted @ 2012-04-18 21:23 wutaoKeen 阅读(160) 评论(0) 推荐(0)
摘要:这题Nim博弈;这一就是要考虑全部为1的情况;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 12 int main( )13 {1 阅读全文
posted @ 2012-04-18 19:31 wutaoKeen 阅读(155) 评论(0) 推荐(0)
摘要:典型的Nim博弈题View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 12 int main( )13 {14 int num[124] 阅读全文
posted @ 2012-04-18 17:05 wutaoKeen 阅读(111) 评论(0) 推荐(0)
摘要:这是一道Fibonacci’s Game (斐波那契博弈)斐波那契博弈模型,是ACM题中常见的组合游戏中的一种,大致上是这样的:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完;2. 之后每次可以取的石子数介于 1 到对手刚取的石子数的 2 倍之间(包含 1 和对手刚取的石子数的 2 倍)。约定取走最后一个石子的人为赢家,求必败态。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm& 阅读全文
posted @ 2012-04-18 16:05 wutaoKeen 阅读(200) 评论(0) 推荐(0)
摘要:这是一道Nim博弈;这要要考虑就是全是1的情况;View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int main( ) 8 { 9 int n,m,num;10 while( scanf( "%d",&n )==1 )11 {12 while( n-- )13 {14 scanf( &quo 阅读全文
posted @ 2012-04-18 00:11 wutaoKeen 阅读(216) 评论(0) 推荐(0)
摘要:这也是一道巴什博弈;这题如果你是先手,考虑你的必胜态。注意,因为任何正整数都能写成若干个2的整数次方幂之和。由于规定只能取2的某个整数次方幂,只要你留给对手的牌数为3的倍数时,那么你就必赢,因为留下3的倍数时,对手有两种情况:1:如果轮到对方抓牌时只剩3张牌,对方要么取1张,要么取2张,剩下的你全取走,win! 2:如果轮到对方抓牌时还剩3*k张牌,对手不管取多少,剩下的牌数是3*x+1或者3*x+2。轮到你时,你又可以构造一个3的倍数。 所以无论哪种情况,当你留给对手为3*k的时候,你是必胜的。题目说Kiki先抓牌,那么当牌数为3的倍数时,Kiki就输了。否则Kiki就能利用先手优势将留给对 阅读全文
posted @ 2012-04-17 23:40 wutaoKeen 阅读(637) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 int main( ) 3 { 4 int Case , n , m; 5 scanf("%d" ,&Case ); 6 while( Case-- ) 7 { 8 scanf( "%d%d",&n,&m ); 9 if( n%( m + 1 )==0 )10 puts( "second" );11 else puts( "first" );12 } 13 return 0; 14 }这是一道简单的巴什博弈;所谓巴什 阅读全文
posted @ 2012-04-17 23:25 wutaoKeen 阅读(282) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2420这个题是一道模拟退火题,但我用的是最小覆盖圆解决的;这是我认为写得比较好的文章,在这里与大家分享。这道题其实就是求一个最小外接圆圆心和半径。所求点即是圆心,距离就是半径。点集的最小外接圆,其实就是点集的最小圆覆盖,就是找一个最小的圆,将所有点覆盖掉。这道题的题意是求一个点,使得到点集的最远点距离最近,下边我用我的方式,不严谨的证明一下。先证明最小外接圆的圆心到其最远的点距离最近。可知最小外接圆上最少有两个点,如果是两个点,必然在一条直径上,否则就至少有三个点,且这三个点之间相对于圆心的夹角两两不超过180度。这点很好证明。如果不满足上 阅读全文
posted @ 2012-04-17 20:23 wutaoKeen 阅读(318) 评论(0) 推荐(0)
摘要:只是一道NIM(尼姆博弈)题;尼姆博弈模型,是ACM题中常见的组合游戏中的一种,大致上是这样的:有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是必败态,无论谁面对(0,0,0) ,都必然失败;第二种必败态是(0,n,n),自己在某一堆拿走k(k ≤ n)个物品,不论k为多少,对方只要在另一堆拿走k个物品,最后自己都将面临(0,0,0)的局势,必败。仔细分析一下,(1,2,3)也是必败态,无论自己如何拿,接下来对手都可以把局势变为(0,n,n)的情形 阅读全文
posted @ 2012-04-16 21:47 wutaoKeen 阅读(875) 评论(0) 推荐(0)
摘要:这题就是对http://acm.hdu.edu.cn/showproblem.php?pid=1527的扩充View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using names 阅读全文
posted @ 2012-04-16 20:49 wutaoKeen 阅读(250) 评论(0) 推荐(0)
摘要:只是我第一道博弈题,这个是威佐夫博弈所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种,大致上是这样的:有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:1、在一堆石子中取走任意多颗;2、在两堆石子中取走相同多的任意颗;约定取走最后一颗石子的人为赢家,求必胜策略。两堆石头地位是一样的,我们用余下的石子数(a,b)来表示状态,并画在平面直角坐标系上。和前面类似,(0,0)肯定是 P 态,又叫必败态。(0,k),(k,0),(k,k)系列的节点肯定不是 P 态,而是必胜态,你面对这样的局面一定会胜,只要按照规则取一次就可以了。再看 y = x 上方 阅读全文
posted @ 2012-04-16 20:46 wutaoKeen 阅读(886) 评论(3) 推荐(0)