摘要: 阶梯博弈:n个阶梯上有n堆石头,把全部石子移动到地面,不能跨过阶梯移动,最后没的移动的输。奇数堆有影响,偶数无影响,偶数移动到奇数,另一个再把那部分奇数移动到另一个偶数,无影响。本题:有个坐标轴,有n个棋子,只能往左移动,不能跨过或覆盖棋子,最后没的移动的输。n为奇数,(num[n],num[n-1]),(num[n-1],num[n-2])...(num[n1],num[1]),(num[1],0);共有n对,可以看成n个阶梯,依次为1,2..n.他们之差绝对值-1则为石子数,偶数堆无影响.这里相当于num[n-1]往num[n-2]移动,此时第2堆石子减少,移动到第1堆了,因为(num[n 阅读全文
posted @ 2012-12-12 18:09 _hikaru__ 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 给一个无向图,n个点,n-1条边,两个人博弈,棋子从k点出发,每人走一步不能往回走,最后没的走的输。输出第一个人能赢的情况下走的最小点。dfs搜出答案。只要有一个能赢就能赢,具体看代码AC代码:#include<stdio.h>#include<string.h>#define N 1010struct pro{ int v,next;} edge[N*3];int head[N],mark[N],min;int e,k;void init(){ memset(head,-1,sizeof(head)); memset(mark,0,sizeof(mark)); e=0 阅读全文
posted @ 2012-12-12 14:44 _hikaru__ 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 输入n,有n个格子,两人轮流往里画X,先得到3个连续的X胜,1胜输出1,2胜则输出2。n<=2000求sg值,可以把游戏分解成i-3和n-i-2两个游戏,再求sg值。AC代码:#include<stdio.h>#include<string.h>#define N 2010int sg[N];int getsg(int n){ if (n<0) return 0; if (sg[n]!=-1) return sg[n]; int flag[N],i; memset(flag,0,sizeof(flag)); for (i=1;i<=n;++i) { . 阅读全文
posted @ 2012-12-10 23:07 _hikaru__ 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 看别人把这题分到博弈去了,DP的成分更大一点。。输入t,t组数据,输入n,a,b;n个数。。两个人取数,A取第一个数0<a<=x1<=b,B取a<=x2-x1<=b;以此类推到不能取为止,sum1=A取数之和,sum2=B取数之和。A要使sum1-sum2最大,B则尽量让sum1-sum2小。而他们都会取最佳的数,即A:MAX(sum1-sum2);B:MAX(sum2-sum1),因此两个人的状况是等同的,所以后面的策略都是固定的。不妨设dp[i]为取第i个数能得到的最大值。而其实对于A和B来说,都有dp[i]=num[i]-max{dp[j]|i<j&a 阅读全文
posted @ 2012-12-09 23:15 _hikaru__ 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 给出一个无环有向图,在节点上放几个棋子,两个人往有向路径移动,最后没的移动的输。搜索求SG值。具体看代码AC代码:#include<stdio.h>#include<string.h>#define N 1010struct pro{ int v,next;} edge[1000*N];int head[N],sg[N];int e;void init(){ memset(head,-1,sizeof(head)); memset(sg,-1,sizeof(sg)); e=0;}void addedge(int u,int v){ edge[e].v=v;edge... 阅读全文
posted @ 2012-12-07 22:36 _hikaru__ 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 当子情况中只要存在P-position(先手必败)那么该情况一定是个N-position(即先手必胜)。如果所有的子情况都是N-position那么它一定是P-position.然后用异或来完成.输入w,h。w*h的矩形,可水平和垂直切割。切出1*1的为胜者。求SG函数值。sg[w][h]=met{sg[i][h]^sg[w-i][h],sg[w][i]^sg[w][h-i]|i>=2};包含所有w,h的后继结点的sg值。然后求met。AC代码:#include<stdio.h>#include<string.h>#define N 210int sg[N][N] 阅读全文
posted @ 2012-12-07 13:22 _hikaru__ 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 楼教主的男人八题之一。。输入n,n个数即n堆石子。可以从其中一堆中拿走最少1颗石子,可以把剩下的石子分配到其他非0的一堆或者几堆。Alice先拿,Bob后;最后没的拿输。A赢1,反之0。下面说的n严格的说输入的n,是除去一堆中为0的n。n=1,必胜;n=2,x=y必败,B可以跟着A走;x!=y必胜,A可以转换成x=y;n=3,x=y必胜,拿掉z就变成(x,y,0)且x=y,B处于必败;x<y<z,z肯定能填补y-x,就可以变成(x,x,0)B必败。n=3必胜n=4,a=b=c=d或a=b,c=d A必败B跟着拿;a=b=c,d和a=b,c,d A都可以转换成a=b=c=d或者a=b 阅读全文
posted @ 2012-12-01 14:33 _hikaru__ 阅读(475) 评论(0) 推荐(1) 编辑
摘要: 输入:t,n;n个数(n<=12):num[0]..num[n-1];输出所有num[i]+num[j]..num[k]=t的式子,i!=j!=k。不可重复,按降字典序输出。简单dfs,太久没写dfs了,忘记递归回来后要mark[j]=0;样例还没检查出来。吃到WA。AC代码:#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>using namespace std;int t,n,num[15],now[1010];int mark[15];int 阅读全文
posted @ 2012-11-30 11:50 _hikaru__ 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 输入m,n,p,q;A(0,0),B(p,0),C(m,q),D(m,n); 路径f:由A到D;g:由B到C的路径。 沿坐标轴正方向走,f,g不能有交集。求路径对(f,g)总数mod 100000007。因为(f,g)不相交数=(f,g)总数-(f,g)相交数;总数:c(m+n,m)*c(m-p+q,q);相交数:c(m+q,m)*c(m-p+n,n);画图可知,相交即f从A进入BC 与g相交。c(m+q,m)求所有从A到C的路径数,c(m-p+n,n)求出B到D的路径数,因为AC与BD必定相交与BC区域内,且每种相交情况都包含在内,因此两数乘积即f从A进入BC区域与g相交再到D的路径数。不过 阅读全文
posted @ 2012-11-29 15:33 _hikaru__ 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 简单置换群输入n,然后输入n个x表示p(y)=x(1<=x,y<=n);p(p(y))=p(x)...问至少多少次可以使p(y)=y(全部的y)。所以就是求循环节的问题,而一个循环节里的数置换次数都是一样,p(..(p(y)))=x,然后求各个循环节长度的最小公倍数即可。#include<stdio.h>#include<string.h>#define N 1010int perm[N],vis[N];int gcd(int a,int b){ return b?gcd(b,a%b):a;}int main (){ int n,ans,len; int i 阅读全文
posted @ 2012-11-27 17:18 _hikaru__ 阅读(245) 评论(0) 推荐(0) 编辑