IT民工
加油!

随笔分类 -  博弈

未入门
HDU 3032 Nim or not Nim?
摘要:/*g(0)=0,g(1)=1。状态2的后继有0,1和(1,1),它们的SG函数值分别是0,1和0,所以g(2)=2。状态3的后继有0,1,2和(1,2),它们的SG函数值分别是0,1,2和3,所以g(3)=4。状态4的后继有0,1,2,3,(1,3)和(2,2),它们的SG函数值分别是0,1,2,4,5和0,所以g(4)=3。我们推测:对于所有的k>=0,有g(4k+1)=4k+1;g(4k+2)=4k+2;g(4k+3)=4k+4;g(4k+4)=4k+3。*/#include <stdio.h>int main(){ int T; scanf("%d" 阅读全文
posted @ 2012-10-22 17:09 找回失去的 阅读(277) 评论(0) 推荐(0)
HDU 2176 取(m堆)石子游戏
摘要:/*第一步判断是不是先手必败非先手必败的话必有解,则输出sg为0的点*//*Accepted 2176 109MS 972K 687 B G++ Yu*/#include <stdio.h>const int MAXM = 200200;int a[MAXM];int main(){ int ans; int m; while(scanf("%d", &m), m) { ans = 0; for(int i = 0; i < m; i ++) { scanf("%d", ... 阅读全文
posted @ 2012-10-22 16:43 找回失去的 阅读(231) 评论(0) 推荐(0)
HDU 2897 邂逅明下
摘要:/*[1-p]必败 [p+1,p+q]必胜(取一个q,就能进入第一个区间)[p+q+1,2*p+q]必败,[2*p+q+1,2*p+2*q]必胜*///对p+q取余即可#include <stdio.h>int main(){ int n, p, q; while(scanf("%d%d%d", &n, &p, &q) != EOF) { int ret = n % (p + q); if(ret >= 1 && ret <= p) puts("LOST"); else puts(" 阅读全文
posted @ 2012-10-22 13:33 找回失去的 阅读(207) 评论(0) 推荐(0)
HDU 2516 取石子游戏
摘要:/*当n为1的时候是输出first,n为2的时候输出second,3的时候也是输出second,当n为4的时候,第一个人想获胜就必须先取一个,这是剩余的石子数为3,此时无论第二个人如何取,第一个人都能够赢,当n为5的时候,first不可能获胜,因为他取2时,second直接取掉剩余的3个,取1时,second也是取1,这样就演变为n为3的时候了,所以n为5时候,输出的是second ,当n为6的时候,first只要取掉1个,就可以让局势变为n为5的时候,输出的是first,n为7的时候,first取掉2个,又可以变为5的时候,所以也是输出first,n为8的时候,当first取1个时候,局势变 阅读全文
posted @ 2012-10-22 13:06 找回失去的 阅读(305) 评论(0) 推荐(0)
HDU 2147 kiki's game
摘要:/*Accepted 2147 0MS 200K 173 B C++ Yu */#include <stdio.h>//n和m不同为奇数,先手胜int main(){ int n, m; while(scanf("%d%d", &n, &m), n + m) { puts( ((n & 1) && (m & 1))? "What a pity!" : "Wonderful!"); } return 0;} 阅读全文
posted @ 2012-10-20 11:53 找回失去的 阅读(113) 评论(0) 推荐(0)
HDU 1564 Play a game
摘要:/*Accepted 1564 0MS 200K 135 B C++ Yu */#include <stdio.h>//画图YY//奇数先手赢,反之后手int main(){ int n; while(scanf("%d", &n), n) { puts(n & 1 ? "ailyanlu" : "8600"); } return 0;} 阅读全文
posted @ 2012-10-20 11:27 找回失去的 阅读(132) 评论(0) 推荐(0)
HDU 1846 Brave Game
摘要:/*巴什博弈当取的石子总数为b + 1的倍数时,先取必败,因为对手每次都能凑出b + 1的倍数,通过取1......b的一种情况。*/#include<stdio.h>int main(){ int a, b, t; scanf("%d", &t); while(t --) { scanf("%d%d", &a, &b); a = a % (b + 1); puts((a) ? "first" : "second"); } return 0;} 阅读全文
posted @ 2012-10-20 11:13 找回失去的 阅读(180) 评论(0) 推荐(0)
HDU 1847 Good Luck in CET-4 Everybody!
摘要:/*巴什博弈我们注意到可以取的牌数包含了1和2这两种情况,剩下的不用管,当你给对手剩下3*n张牌时,你就赢了。巴什博弈的模型..*/#include<stdio.h>int main(){ int n; while(scanf("%d", &n) == 1) { puts(n % 3 == 0 ? "Cici" : "Kiki"); } return 0;} 阅读全文
posted @ 2012-10-20 11:12 找回失去的 阅读(128) 评论(0) 推荐(0)
HDU 1848 Fibonacci again and again
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1005;int fib[MAXN], e[MAXN], h[20];void calcFib(){ int i; fib[1] = 1, fib[2] = 2; for(i = 3; i <= 16; i ++) { fib[i] = fib[i - 1] + fib[i - 2]; }}/*求SG值*/void calcE(){ int i, j, k; e[0] = 0, e[1] = 1; ... 阅读全文
posted @ 2012-10-20 11:11 找回失去的 阅读(157) 评论(0) 推荐(0)
HDU 1849 Rabbit and Grass
摘要:/*转换成Nim模型,对于每个棋子位于的位置b,G[b] = 0,即sg[b] = b多个棋子异或一遍就得出答案了,为0先手必败。*/#include<stdio.h>int main(){ int n, a, b; while(scanf("%d", &n), n) { scanf("%d", &a); n --; while(n --) { scanf("%d", &b); a ^= b; } puts(a ? "Rabbit Win!" : "... 阅读全文
posted @ 2012-10-20 11:07 找回失去的 阅读(203) 评论(0) 推荐(0)
HDU 1850 Being a Good Boy in Spring Festival
摘要:/*Nim模型*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXM = 105;int m, ni[MAXM];int main(){ int i, cnt, res; while(scanf("%d", &m), m) { res = cnt = 0; for(i = 1; i <= m; i ++) { scanf("%d", &ni[i]); res ^= ni[i]; } ... 阅读全文
posted @ 2012-10-20 11:06 找回失去的 阅读(142) 评论(0) 推荐(0)
HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者
摘要:/*巴什博弈的模型*/#include<stdio.h>int main(){ int n, m, T; scanf("%d", &T); while(T --) { scanf("%d%d", &n, &m); puts((n % (m + 1)) ? "Grass" : "Rabbit"); } return 0;} 阅读全文
posted @ 2012-10-20 11:04 找回失去的 阅读(168) 评论(0) 推荐(0)
HDU 2149 Public Sale
摘要:/*巴什博弈先判断是不是先手必败*/#include<stdio.h>int main(){ int m, n, i; while(scanf("%d%d", &m, &n) != EOF) { if(m > n) //这种情况先手非必败的话只有一种出法 { if(m % (n + 1) == 0) { puts("none"); continue; } else prin... 阅读全文
posted @ 2012-10-20 11:01 找回失去的 阅读(193) 评论(0) 推荐(0)
HDU 1848 Fibonacci again and again
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1005;int fib[MAXN], e[MAXN], h[20];void calcFib(){ int i; fib[1] = 1, fib[2] = 2; for(i = 3; i <= 16; i ++) { fib[i] = fib[i - 1] + fib[i - 2]; }}void calcE(){ int i, j, k; e[0] = 0, e[1] = 1; for(i ... 阅读全文
posted @ 2012-09-06 17:27 找回失去的 阅读(185) 评论(0) 推荐(0)
HDU 1847 Good Luck in CET-4 Everybody!
摘要:当对手面对3的时候,你就已经赢了,所以,尽可能的给对手剩下3,那么只要n是3的倍数就是Cici赢,不是的话,Kiki会想办法给Cici留下3。#include<stdio.h>int main(){ int n; while(scanf("%d", &n) == 1) { puts(n % 3 == 0 ? "Cici" : "Kiki"); } return 0;} 阅读全文
posted @ 2012-09-06 14:20 找回失去的 阅读(170) 评论(0) 推荐(0)
HDU 1846 Brave Game
摘要:简单博弈,记得小学数学课上也有这个类似的问题,只不过每次只能取1到2个,问取到30谁能赢。答案是后取的人赢,因为每次都能凑成3,所以后取的人采用这种策略就不会输。这道题呢,每次凑m+1,如果能被n整除,那么第二个人就能赢,如果不能,那么第一个人可以采用策略使剩下的石子数能被m+1整除,然后按照第二个人之前的策略就能赢。#include<stdio.h>int main(){ int a, b, t; scanf("%d", &t); while(t --) { scanf("%d%d", &a, &b); a = a 阅读全文
posted @ 2012-09-06 14:03 找回失去的 阅读(126) 评论(0) 推荐(0)
POJ 1067 取石子游戏
摘要:威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。/*黄金分割比例判断是不是非奇异局势,面对奇异局势必败两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜反之,则后拿者取胜。*///公式 ak =[k(1+√5)/2],bk= ak + k/*Accepted 184K 0MS C++ 334B 2012-08-23 16:55:14*/#include<stdio.h>#include<math.h>const double key = (sqrt(5.... 阅读全文
posted @ 2012-08-23 17:05 找回失去的 阅读(306) 评论(0) 推荐(0)