09 2012 档案
摘要:博弈(给出牛人的解题思路)先引入必胜点和必败点两个概念: 必败点(P点) :前一个选手(Previous player)将取胜的位置称为必败点。 必胜点(N点) :下一个选手(Next player)将取胜的位置称为必胜点。算法实现: 步骤1:将所有终结位置标记为必败点(P点);(终结位置指的是不能将游戏进行下去的位置) 步骤2:将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点) 步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ; 步骤4:如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。解题思路: 由于每次都是从p
阅读全文
摘要:这个题要分情况讨论:就是当k>=n时,first一定赢;当k==1时,当k为奇数时,first赢,反则second赢;当k<n&&k!=1一定是second赢,因为每次无论first怎么取,second一定可以使之对称并且是偶数个;那么second一定会赢;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #incl
阅读全文
摘要:我们发现后手是堵不死先手的,如果后手不管先手任他走,那么先手要先一步走到;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #
阅读全文
摘要:Nim博弈题:这个题是要你求如果先手能赢,有几种策略;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL
阅读全文
摘要:一道典型的Nim博弈:View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using
阅读全文
摘要:这是一道找规律的题目:我们发现最后的棋子一定会到达1,3,4因为这3个地方是不可能拿到别的地方的:那么我们就只要对一步可以到1||3||4进行Nim计算就可以了,因为任何1个点2步之内就可到1||3||4因此我们就只要考虑j % 6 == 0 || j % 6 == 2 || j % 6 == 5他们的情况:View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<que
阅读全文
摘要:取走-分割游戏 这种游戏允许取走某些东西,然后将原来的一个游戏分成若干个相同的游戏。例1、Lasker’sNim游戏:每一轮允许两种操作之一。(1)从一堆石子中取走任意多个(2)将一堆数量不少于2的石子分成都不为空的两堆。分析:很明显,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。在推一些,我们得到:我们...
阅读全文
摘要:这跟巴什博弈是一样的找出区间[1-p]必败[p+1,p+q]必胜(取一个q,就能进入第一个区间)[p+q+1,2*p+q]必败,[2*p+q+1,2*p+2*q]必胜;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring>
阅读全文
摘要:这是一道找规律的博弈题,我们只要找到谁拥有主动权,而主动权就是当一个数是另外一个数的2倍以上,这时他就可以掌握全局的胜利;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector>
阅读全文
摘要:转载:http://blog.csdn.net/cscj2010/article/details/7760858题目大意是:两个家伙在区域赛前夕闲的无聊,然后玩一种无限纠结的游戏,随即给定一个日期,每次只能移动day OR month..........而且如果下一个月没有当前day的话, 你就不能移动month,比如1月31日,你只能移动day 使其到2月1日,而不能移动月让其到达2月31日,原因你懂的!嗯,现在Adam开始YY了要!需要你来找一个必胜策略!(到达2001.11.4日就不能移动,无法移动的孩纸败必败 必胜11.4 11.311.2 ...
阅读全文
摘要:一道很不错的题目,这里加入连接限制同时还考察优化,优化方法同上。连接限制如何处理?注意到项链个数很少,因此可以建图,然后分别求出每种颜色连接n个珠子后回到自身的方案数,累加即可,这里可以用矩阵快速幂求解。View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #inclu
阅读全文
摘要:这是一道简单的置换群的问题;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long usi
阅读全文
摘要:题意:有一条从1~n的单向高速路,现在要你修建两单向路条路,使任何一个点可以到任何的点,求这两天的路最短;注意:起始中点要不同;我们知道要满足条件,那么我们就必定使1~n有通路,我们可以从1~n修一条路,在从n-3条边选出最短的边就可以了;这里为什么是从n-3条边里选,这里我们要去掉两个端点的边;例如:n=4 时 4 7 9,这里答案是12而不是11;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cma
阅读全文
摘要:这是一道置换+DP的的题目;题意是要你把每一个置换都可以分解成若干个轮换,那么这些轮换的阶的最小公倍数就是该置换的阶。这里要我们求怎样分解使最小公倍数最大,并且使置换排序最小;怎样求最大的最小的公倍数,这里我们用DP的方法可以容易求出;dp[i][j]表示i分解成j个数;排序就只要对因子进行排序就可以了(自己写一下就知道了)在进行输出;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #
阅读全文
摘要:一道半平面相交的题目:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace st
阅读全文
摘要:这是一道求凸多边形多核的问题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespac
阅读全文
摘要:这是一道置换题目,我们只要找出每个置换循环的循环节就可以了,对K进行取模,在进行模拟就OK了;代码1:View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include&l
阅读全文
摘要:这是一个比较赤裸的群论题目,只是对他进行分步计算就可以了:首先是旋转计算;在进行对称计算,这时候我们要对它进行奇偶讨论,当为奇数是我们就以每个顶点与它的对边中点连线为对称轴,那么循环节为(n+1)/2;当为偶数时:有两个种对称轴,一是以顶点连线,二是以边的中点连线,前者循环节为n/2,后者为n/2+1;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue&
阅读全文
摘要:这个题是一道置换问题的题,是黑书上面的无聊的排序问题;根据群论知识我们可以分解为S个不想交的循环的乘积。例如:8 4 5 3 2 7,目标状态为2 3 4 5 7 8,我们可以分解为两个循环的乘积,(8 2 7 ), ( 4 3 5 )。我们知道对两个循环分别进行完成交换,就可以完成任务;对于任意一个循环i,设他的长度为ki,容易证明至少要循环ki - 1次,即每次让一个元素到达目标位置,而当第ki - 1元素到达目标以后显然第ki个也到达目标。我们知道每个循环至少要交换一次,要代价最小,因此我没每次拿最小的元素去交换,总的花费是sum(循环总值)+ ( cnt(循环个数) - 2 )*min
阅读全文

浙公网安备 33010602011771号