博弈_ZOJ3591_序列中子序列异或值大于0.cpp
摘要://============================================================================// Name : 博弈_序列中子序列异或值大于0.cpp// Author : cchun// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//=============================================================...
阅读全文
posted @
2013-05-08 11:05
cchun
阅读(673)
推荐(0)
ZOJ 2083 Win the Game
摘要://ZOJ的类似题//State: ZOJ2083 C++ 0 188//题目大意:A和B轮流给n条线染色(A先),每人每次只能染一条// 线的一段(长度为2)。不能染色者为输。#include <iostream>#include <stdio.h>#include <cstring>using namespace std;const int MAX = 55;int sg[MAX];int get_sg(int n){ if(sg[n] != -1) return sg[n]; if(!n || n == 1) r...
阅读全文
posted @
2012-08-04 16:50
cchun
阅读(224)
推荐(0)
ECNU_1328_ECNU_1328_Stripes_用三种长度的线段覆盖一条线段
摘要:/**State: ECNU 1328 Yes 236K 0MS C++ 0.96K*题目大意:* 给定red、green、blue三种长度分别为c、z、n的矩形条纹,要求* 用这三种矩形条纹来cover大小为p x 1的game board,第一个不能* 再cover的选手为输。问先手是否能赢。*解题思路:* 好像是变种了的博弈,想想,原来可以用sg来模拟,其实就是先拿掉一些,* 再把一堆变成两堆的那种Nim博弈。*/View Code 1 #include <iostream> 2 using...
阅读全文
posted @
2012-08-04 16:34
cchun
阅读(223)
推荐(0)
HDU1729_Stone Game_新型求sg值
摘要:/**State: 1729 0MS 268K 726 B C++*题目大意:* (取石子游戏)有n个箱子,体积为Si,当前箱子里的石子数为Ci。* 两个人轮流往箱子里放石子,而且每一次放是数量都有限制,不能* 超过当前箱子内石子数的平方。例如箱子里有3颗石子,那么下一个* 人就可以放1~9颗石子,直到箱子被装满。当有一方放不下石子时游* 戏结束,最后放不下石子的人输。*解题思路:* 一开始我的想法就是正确的,求sg值,sg值也能用笔模拟出来,但* 关键的一步是箱子...
阅读全文
posted @
2012-08-02 22:21
cchun
阅读(259)
推荐(0)
HDU3032 Nim or not Nim
摘要:/**State: *题目大意:* Alice和Bob轮流取N堆石子,每堆S[i]个,Alice先,* 每一次可以从任意一堆中拿走任意个石子,也可以将* 一堆石子分为两个小堆。先拿完者获胜。(1 ≤ N ≤ 10^6,* 1 ≤ S[i] ≤ 2^31 - 1)*解题思路:* 找sg规律。*解题感想:* 一看数据规模就知道sg不靠谱,应该是规律型的。* 自己用笔模拟了大半天,模拟得蛋疼了之后干脆写成* 代码吧,结果计算机一算就是靠谱些(用笔还模拟错了,* 怪不得一开始没...
阅读全文
posted @
2012-07-29 22:31
cchun
阅读(480)
推荐(2)
HDU3094_A Chess Game_树形删边博弈
摘要:/**State: 3094 156MS 2144K 1315 B C++*题目大意:* 给定n棵树(树中包括简单的多边形),每棵树有m个结点(1~m)和k条边* (结点1给根节点)。Harry和Sally轮流删除树上的一条边,并切移除所* 以和根节点不再连通的所有边和结点。最后不能再删除边的一方为输。*解题思路:* 叶子节点的 SG 值为 0;中间节点的 SG 值为它的所有子节点的 SG 值* 加 1 后的异或和。(加1是因为拆成链的时候,要考虑到链头结点,因为* 算的其实就是链头的结点。...
阅读全文
posted @
2012-07-29 15:55
cchun
阅读(381)
推荐(0)
HDU3595_GG and MM
摘要:/**State: HDU3595 62MS 272K 1262 B C++*题目大意:* 给定两个整数,两人轮流从较大的数中减去较小数的倍数(所有的结果数都非0)。* 直到不能再减者为输。而且有n个游戏同时进行。*解题思路:* 先用gcd来求出谁胜谁负,当第一个出现a % b == 0 || a / b > 2的时候,这轮选* 手就胜利,然后要记录路径,由最后的胜者来根据记录的路径来计算这一局的次数。* 由于是n个游戏同时进行,而且可以走就要走光所有,所以只需记录最长的那一局* 即是...
阅读全文
posted @
2012-07-29 02:09
cchun
阅读(251)
推荐(0)
POJ2425 && HDU1524_ A Chess Game_树形博弈
摘要:/**State: Accepted 8104K 485MS C++ 1428B*题目大意:* 两个人在一个有向五环图上面走棋子,每次只能走一步,最后谁* 没有棋子可走就败,然后棋子可以重叠,并且有n个棋子。要求判断* 先手的胜负。*解题思路:* 一开始没有思路,后来试着用sg去推,推出sg了。*解题感想:* 用了静态邻接表之后,快了,但是此题不明显。* 果然,静态邻接表的边的数目要把握好,RE了两次。*/View Code 1 #include <iostream> 2 #inclu...
阅读全文
posted @
2012-07-28 14:42
cchun
阅读(332)
推荐(0)
HDU1851_A Simple Game_求sg
摘要:/**State: 1851 0MS 268K 862 B C++*题目大意:* (类似)给定n堆石子,然后规定每堆石子只能* 取的个数,然后最先取完者胜,要求判断局势的奇异。*解题思路:* 分别求sg即可。*/#include <iostream>#include <stdio.h>using namespace std;const int MAX = 21;int get_sg(int n, int t){ int sg[MAX], vst[MAX]; for(int i = 0; i < MAX; i++) ...
阅读全文
posted @
2012-07-27 00:56
cchun
阅读(236)
推荐(0)
HDU1536_S-Nim_求sg值
摘要:/**State: 1536 343MS 368K 1164 B C++*题目大意:* 给定一个集合S,然后规定每一堆石头只能取集合S中* 个数,然后要求出所有sg值,并判断结果。*解题思路:* 典型的求sg函数即可求解。*题目困惑:* 题目困惑了好久,最后我把错误排除到了求sg函数上,* 可是还是觉得没有问题,最后还是看了别人的解题报告,* 眼睛一扫,一秒就知道了问题所在。* 其实我一开始就想到了S集合要排序,但是没有细想,就* 过了,结果困扰了我这么久。*...
阅读全文
posted @
2012-07-27 00:09
cchun
阅读(1084)
推荐(0)
HDU1848_Fibonacci again and again_经典的求sg
摘要:/**State: 1848 0MS 320K 994 B C++*题目大意:* 给定3堆棋子,每次可以从每一堆中拿斐波那契个棋子,最后* 先取完者胜,判断该局是否为奇异局势(P或N点);*解题思路:* 典型的求sg函数即可求解。*/#include <iostream>#include <stdio.h>using namespace std;const int MAX = 1024;int sg[MAX];void pre_init(){ int fib[1024]; fib[0] = fib[1] = 1; ...
阅读全文
posted @
2012-07-26 16:30
cchun
阅读(333)
推荐(0)
转_博弈论知识汇总
摘要:转载:http://www.wutianqi.com/?p=1081以下是我从网上收集的关于组合博弈的资料汇总:有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.
阅读全文
posted @
2012-07-26 15:43
cchun
阅读(244)
推荐(0)
POJ1704_棋盘上的博弈
摘要:/**State: 1704 Accepted 200K 16MS C++ 594B*题目大意:* 一个1*M的棋盘上有N个棋子,初始位置一定,两人轮流操作,* 每次移动一枚棋子,要求只能向左移且至少移动一格,而且不* 能到达或经过以前有棋子的格子,谁无法移动棋子就算输。*解题思路:* 先考虑两个棋子靠在一起的时候,这两对棋子就构成了一个* 奇异局势(P点)。所以可以把题目中的棋子分解为两对两对,* 两对两对之间是不需要考虑什么的。在同一对棋子中,如果对* 手移动前一...
阅读全文
posted @
2012-07-26 15:27
cchun
阅读(1459)
推荐(0)
POJ1067_取石子游戏_威佐夫博弈
摘要:/**State: 1067 Accepted 176K 16MS C++ 435B*题目大意:* 威佐夫博弈*解题思路:* 略。*/#include <iostream>#include <stdio.h>#include <cmath>using namespace std;int main(void){ int big, small; while(scanf("%d %d", &big, &small) == 2) { if(big < small) { big ...
阅读全文
posted @
2012-07-26 15:26
cchun
阅读(347)
推荐(0)
转_博弈论(比较全)
摘要:博弈论(一):Nim游戏重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算。Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了。Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在
阅读全文
posted @
2012-07-26 15:25
cchun
阅读(908)
推荐(0)
POJ1740_A New Stone Game_推规律的博弈
摘要:/**State: 164K 0MS C++ 1254B*题目大意:* 对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,* 第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余* 石子的一部分分给其它的某些堆。最后谁无子可取即输。*解题思路:* 1、先考虑1堆的时候,1堆当然是N点(必胜点),* 2、然后考虑2堆,细想一下可以发现,当2堆一样时,这个时候* 的目的就是要把对方给逼到只有2堆都是1的时候,就能必胜了。* 但是想一下,后手只要模范先手所做的动作,那么...
阅读全文
posted @
2012-07-26 02:59
cchun
阅读(321)
推荐(0)
HDU1907 && HDU2509_Nim博弈变形
摘要:/**题号:1907*State: 15MS 268K 572 B C++*题目大意:* Nim博弈的变形,就是先取完者败。*解题思路:* 如上题。* //必输态 S0(考虑奇偶), T2* //必胜态 S2, S1, T0*/View Code 1 #include <iostream> 2 using namespace std; 3 int main(void) 4 { 5 int cas; 6 scanf("%d", &cas); 7 while(cas--) 8 { 9 ...
阅读全文
posted @
2012-07-25 23:28
cchun
阅读(1122)
推荐(1)
转_HDU_1907&2509 博弈(Nim博弈变形)
摘要:学了三种简单博弈(前一篇)之后,我又在这篇博文这学了HDU1907的解法下面说下我的理解,有些借鉴原博文。这题和下面的题有点相似,但是又不一样也就是说把最后取完的定为输家改成,最后取完的定为赢家。后面的这个要简单一点,下面是简单分析,先来看这个简单的首先我们用T表示当前状态的所有火柴数异或为0,否则极为S。1.S可以转化成T我们设一共有n堆火柴,每堆有k(i)根.那么S态中k(1)^k(2)^……^k(n) != 0,这个值我们记为c那么肯定有某个k(i)的最高位和c的最高位同为1,不然c的最高位变成了0假设这个最高位和c的最高位同为1的是第m堆,这样我们可以得到x = k(m)^c <
阅读全文
posted @
2012-07-25 22:55
cchun
阅读(763)
推荐(0)