摘要: 这个题目是这样的,一堆石子有n个,首先第一个人开始可以去1-(n-1)个,接下来两人轮流取石子,每个人可取的石子数必须是一个不超过上一次被取的石子的K倍的整数。现在求对于一堆数量为n的石子是否为必胜态,如果是的话,先手者第一次最少可以取多少石子?这个题目是一个典型的K倍动态减法游戏。构造两个数列,然后直接判断就好了。至于数列的构造原理,我自己弄得也不是很透彻,等我透彻了再写写吧。对于输出最小的可行解,就是逐步减小并且判断就好了。 1 #include 2 #include 3 #define maxn 5000000 4 using namespace std; 5 6 int a[ma... 阅读全文
posted @ 2013-10-21 17:10 092000 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是给你n个ai,有多少种不同的连续段使得用该段数中所有的数字玩Nim游戏的先手必胜。首先根据博弈论的知识,我们知道,要使先手必胜,那么只要保证所有的数的异或值不为0就可以了。这个题目,给的ai的求法给了我很大的误导,我一开始以为要从哪里入手来突破这个题目。结果。。。。。。。深坑啊。是这样来考虑的,我们直接模拟,分别得出所有的ai的值,然后用一个数字fi表示a1到ai连续的数的异或值。这样要求异或不为0的情况,我们只要求出所有值为0的情况,然后将所有的情况减去这些情况就可以了。对于求所有值为0的情况,有两种可能:一、f[i]=0,说明从1到i的数所有的数的异或值就为0,这就是一个满足条 阅读全文
posted @ 2013-10-18 20:30 092000 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是给你若干个数字,两个游戏者轮流操作,每次可以将该数变为一个小于当前的一个约数,无法操作的游戏者fail。和其他的博弈题目大同小异吧。不同点有两个,逐一分析吧。一、每次改变一个数只能改变为小于当前数的约数,所以相对来说Sg函数值得求法有点不同哦。自己打个表就可以发现这个题目的Sg函数值是该数的除了1以为的约数的个数。这样我们可以用一点数论的知识把Sg函数值搞定了。二、题目还要对于必胜态,输出改变的标号最小的数。就是对于每一个数,异或判断是否可行就可以了。 1 #include 2 #include 3 #include 4 #define maxn 5000005 5 usin... 阅读全文
posted @ 2013-10-18 20:18 092000 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 这个题太坑爹了,题意也好纠结。是这样的,给你一个n*m的矩形,中间有n*m个1*1的格子,有不同的跳跃方法。如果当前为human(人类)那么他可以有意识的选择自己下一步跳往何方;如果当前为pig(猪)那么它会沿着上一次跳跃的步奏跳跃。现在问你对于每一个格子,初始状态为那种(human OR pig)可以使得最后跳出整个矩形。这样想,对于(1,1)的P显然可以一步就跳出去了。所以这是一个必胜态。然后任何一个可以直接跳到(1,1)的格子都应该为H,不为H的格子一定就是P了,因为沿着上一次的方向跳一定可以跳到一个H去。题目中我直接用的一个一维数字模拟二维数组,时间和空间上都十分可观,就是(T_T)调 阅读全文
posted @ 2013-10-18 19:49 092000 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 这个题目很有趣,有博弈知识,又有一点智商题的感觉。题意为给你一段长为n的的线段。两个游戏者轮流在一段长为2,未被染色的线段上涂色。无法涂色的游戏者输。题目有点灵活。关键在于怎么得到Sg函数值呢?其实是这样的,对于一个长度为n的线段,我们枚举中间可能的连续的两个单位长度进行染色,然后判断是否存在一种染色使得染色后的状态为必败态就可以了。不过要注意哦,染色后,原来的一段会变为两端(如果染色在端点,可以视其中一段为0),这样接下来的两端就需要分别染色了,所以根据博弈论的只是我们就知道,接下来的Sg函数值就是这两个长度所对应的Sg函数值的异或哦。然后用传统的Sg函数的Mex求法就可以了。 1 #inc 阅读全文
posted @ 2013-10-18 19:39 092000 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 题意是这样的,一开始给你一串数字,两个人轮流操作,操作可以分为两种。1、每次修改一个数字,使其变为一个小于当前的非负数。2、移除中间的某一个0以及0右边的所有数字。使得所有数字消失的游戏者获胜。题目有一个很关键的条件,最多只有6为,其实我们可以这样考虑这个问题。对于每一位,最多有11种状态,0到9以及空。所以我们可以用6个11进制表示所有的状态,这样算来时间上是可以承受的。然后的话,就是典型的记忆化搜了,对于每一个数,枚举每一种后继的状态,然后用基本的博弈知识判断该状态是必胜还是必败。 1 #include 2 #include 3 #include 4 #define maxn 200... 阅读全文
posted @ 2013-10-18 19:33 092000 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是给你一个多边形,每条边上有一个权值,你开始在第一个点。每次你必须经过一条有权值的边,并且把该边的权值减小到任意一个非负值,到达该边的另外一个点。谁第一个无法操作就算输。题意很简单,解法也很简单。这样考虑,题目说明了在给定的边中一定有一条边为0,也就是说给的是一条链,实际上不是环。结论是这样的,先手的人可以有两个方向走,如果任意一个方向上有奇数条权值大于0的边,那么先手必胜,如果任意一个方向上的离0边的距离都为偶数或0,那么就是必输。证明也很简单。假设在任意一个方向上恰好有奇数条边,那么一开始先手的人可以通过这条边,并且把该边的权值减少到0;那么接下来,另一个游戏者必须沿着该方向走, 阅读全文
posted @ 2013-10-18 19:24 092000 阅读(322) 评论(0) 推荐(0) 编辑
摘要: 题意很简单,给你一个字符串,要求你求出一个最长的形似于w(wr)w(wr)的最长连续子串的长度。wr表示w的逆序串。在这里大家很容易就能想到Manacher算法求回文串。没有错,就是这个。算法的详细过程我就不说了,直接说后面的实现吧。通过manacher算法我们可以在O(N)的时间复杂度以内求出一每两个字符空缺处为对称轴的最长回文串的长度。这样我们可以对于每一个空缺位置逐一枚举,然后分别对匹配求出一个最长的回文串就可以了。中间有好多细节要优化哦,我wa了好几发。还有在写的时候一定要写出各种优化。代码不要写挫了。 1 #include 2 #include 3 #include 4 #de... 阅读全文
posted @ 2013-10-18 19:12 092000 阅读(465) 评论(0) 推荐(0) 编辑
摘要: 题目意思是这样的,给定一个数N,第一个可以减去任意一个数(不能为N本身),然后接下来轮流减去一个数字,下一个人减去的数字必须大于0,且不大于2倍上一次被减去的数字。把N减为0的人获胜。看完题目后不会做,果断就上午找题解了。原来如此啊。。。。 首先我们可以打个表(在30的范围以内),就可以发现必败态是N为斐波那契数。也就是说如果给定的数字不是一个斐波那契额数,那么就是必胜的。接下来的问题是如何找到一个第一次减小的最小的数字呢?可以递归找,每次都找最近的,知道恰好等于一个斐波那契数为止。 1 #include 2 #include 3 #include 4 #define inf (unsi... 阅读全文
posted @ 2013-10-17 21:52 092000 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 题目的意思就不说了,典型的取石子的博弈问题。题目的前半部分就是赤果果的SG函数值异或就可以了,其中Sg函数值就是石子数本身。但是接下来有个小变换,就是要你输出先手必胜有多少种不同的取法。首先要想保持必胜,必须要取完以后保证所有的石子数异或值为0.这样,假设我们来判断某一堆是否可取的时候,我们可以用总的异或值来与当前堆石子数异或一下,就得出当前堆应该剩下多少石子哦(仔细理解这里就好了)下面可以贴代码了: 1 #include 2 #include 3 using namespace std; 4 5 int a[1005],n,m,ans; 6 7 int main() 8 { 9 ... 阅读全文
posted @ 2013-10-17 21:47 092000 阅读(227) 评论(0) 推荐(0) 编辑