06 2014 档案
摘要:增加一个判素数的步骤就过了。太囧了。。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int k; 7 8 int main(){ 9 while(scanf("%d",&k)!=EOF){10 ...
阅读全文
摘要:简单题,直接用STACK模拟整个过程。模拟出栈时,应注意保护现场,等到递归完成后返回。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 const int MAX=105; 7 8 char ans[MAX*2]; 9...
阅读全文
摘要:双向广搜。。。呃,双向广搜一般都都用了HASH判重,这样可以更快判断两个方向是否重叠了。这道题用了双向的BFS,有效地减少了状态。但代码太长了,不写,贴一个别人的代码。。 1 #include 2 #include 3 #include 4 #include 5 using namespa...
阅读全文
摘要:EASY 1 #include 2 #include 3 using namespace std; 4 5 bool prim[45]; 6 int n; 7 bool vis[45]; 8 int ans[25]; 9 10 void dfs(int top){11 if(top>n...
阅读全文
摘要:经典DP。设dp[i][j]为前i分钟移动j次所得的最大苹果数,本来打算再设一状态表示当前在哪棵树,但发现移动的次数就能确定了。dp[i][j]=max(dp[i-1][k-1]+catc(k%2,app[i]),dp[i-1][k]+catc(k%2,app[i])); 1 #include ...
阅读全文
摘要:选课[问题描述]在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从...
阅读全文
摘要:因为苹果可能在不同的子树中,所以,很容易想到设状态dp_back[i][j]为以i点为树根走j步并回到i点的最大苹果数与dp_to[i][j]不回到i点的两个状态。于是,转移方程就很明显了。只是注意要减去一来一回,或者不回的边。树形DP里套背包。但这题远比这复杂,个人认为。因为在实现上细节太多。实现...
阅读全文
摘要:很久以前做的树形DP题,今天再遇到时,竟然不会了,所以写写。。设数组:prf[MAX][MAX],cost[MAX],sum[MAX]。分别表示,在第i个结点为根的子树内的情况下,若有j个用户申请看电视,所能得到的最大费用。cost表示传送到i点时所花的费用,而sum表示当前结点为根的子树内已访问的...
阅读全文
摘要:母函数简单题 1 #include 2 #include 3 using namespace std; 4 5 const int MAX=130000; 6 int c1[MAX],c2[MAX]; 7 8 struct { 9 int val,num;10 }thing[55];...
阅读全文
摘要:经典DP,这样的递推确实有点难。 把所有直线分成两组,可以知道m条直线的交点方案数=(m-r)条平行线与r条直线交叉的交点数+ r条直线本身的交点方案亦就是 =(m-r)*r+r条之间本身的交点方案数(0 2 #include 3 using namespace std; 4 5 bool an...
阅读全文
摘要:1 #include 2 #include 3 using namespace std; 4 5 const int MAX=105; 6 7 bool vis[MAX][MAX]; 8 char maze[MAX][MAX]; 9 int n,m;10 int dir[8][2]={0,...
阅读全文
摘要:1 #include 2 #include 3 using namespace std; 4 5 const int MAX=13; 6 7 char maze[MAX][MAX][MAX]; 8 9 struct {10 int i,j,k;11 }beg,des,que[11...
阅读全文
摘要:简单题 1 #include 2 #include 3 #include 4 using namespace std; 5 6 const int MAX=205; 7 const int inf=1000000; 8 int tim[MAX][MAX]; 9 char maze[MAX][...
阅读全文
摘要:经典搜索 1 #include 2 #include 3 using namespace std; 4 5 const int MAX=10; 6 7 int step[MAX][MAX]; 8 char maze[MAX][MAX]; 9 int n,m,t;10 struct {11 ...
阅读全文
摘要:首先,p,q>=2,所以p,q=10000时,p 2 #include 3 4 using namespace std; 5 6 bool num[10005]; 7 int m,a,b; 8 int pnum[10000]; int n; 9 void type_table(){10 ...
阅读全文
摘要:好吧,这题直接搜索就可以了,不过要按照长度最短的来搜,很容易想得到。记得ACM比赛上有这道题,呃。。不过,直接搜。。呵呵了,真不敢想。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 char s...
阅读全文
摘要:这题有点类似LIS,由于颜色最多100种,所以只需建立一个100的数组,按对立面的关系以某种颜色为向上面的最大值就可以了。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int cube[505][7]; 7 int ...
阅读全文
摘要:自己之前的不见了。。这题是双向广搜即可过。。 1 // Colour Hash (色彩缤纷游戏) 2 // PC/UVa IDs: 110807/704, Popularity: B, Success rate: average Level: 3 3 // Verdict: Accepted ...
阅读全文
摘要:黑书上说用二分图的知识来解,但我想不出来,只好找规律发现,一条柱时为1,两条柱时为4。三条柱时为8。。这些1,3,7,11的数字加1后,都是下一条柱的最底部的数字,而且一条柱的数字之和总是按照这样的规律。1^2,2^2,3^2,4^2......所以。。 1 #include 2 #include...
阅读全文
摘要:绝好的贪心题把马按照从大到小排序。若田忌的快马比王的快马快,直接赢若田忌的快马比王的快马慢,则用最慢的马和王比若快马相等,则转向慢马。若田忌的慢马比王的慢马快,则赢,指针移位。否则,比较田忌的慢马与王的快马,若相等,直接和。否则,让慢马输给王的快马(只有这种情况)想想,应该是按上面的解答的。这题的贪...
阅读全文
摘要:很明显地,我们知道,当N=1,2时,先手胜。当N=3时,可以把取走中间一个硬币,得到1,1。依然是先手胜。当N=4时,取走中间两点得到1,1,即先手依然取胜。当N=5时,取走中间1点,依然先手胜。于是,当ALICE取走开头的硬币后,即得到一条链。那么,只需BOB把这条链平均分成两半,做对称操作,即可...
阅读全文
摘要:这题,通过多次试验,可以发现,当只存在两堆(以下称对)相等的石子时,先手必输。更进一步,当N对这样的石子存在时,先手必输。于是,若1要赢,一种方法是,把石子都变成相等的对。考虑石子中无对的情况,若存在对,我们把那些对忽略,因为先手对于这些对是必输的。当N为奇数时,随机考虑这样的情况(有序)a=(b-...
阅读全文
摘要:树的删边游戏。。由于题目的特殊性,我们只需计算环的边数值。若为偶环,则直接把环的根节点置0。若为奇环,则留下一条边与根结点相连,并那它们的SG置0;注意的是,两个点也可构成环,因为允许重边。所以,我们只需求点双连通分量,并判断分量中边的数量即可。然后DFS求树的SG值。 1 #include ...
阅读全文
摘要:关于tarjan 的思想可以在网上搜到,具体我也不太清楚,应该说自己理解也不深,下面是做题经验得到的一些模板。 其中有很多转载,包括BYVoid等,感谢让我转。。。望各路大神愿谅 有向图求连通分量的一般方法: 1 void Tarjan(u) { 2 dfn[u]=low[u]=++index 3
阅读全文
摘要:博弈题,使用DP来完成。开始时,我以为可以用极大极小加剪枝可以过,但,TLE。。。看过一些题解,没看懂,但也由此有了启发:我们只记录差(初始为0),那为1选的数即为在原差值上加上该数,2选即是减去该数。那么,可以有以下的式子来表达这一过程ANS=A-B+C-D+E-F;神奇的事情来了,将式子转换一下...
阅读全文
摘要:利用后继节点的SG值求出当前的SG值。在当前任意一个BLANK插入一个x后,分成两段,于是,看成两段的NIM,异或和,按SG的定义求出当前的SG值即可。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 ...
阅读全文
摘要:对于这道题,我们需要从(A+B)%3==0这式子考虑。对于第一条式子,我们可以知道,只能是奇偶盒子交替转移。由第二条式子可知,要么是同余为0的A,B之间转移,要么是余数为1,2之间的 转移。后来仔细比对发现,同余为0的只能是一条路径(即只能在同余为0之间转移)内。对于1,2之间的转移,恰好是两条路径...
阅读全文
摘要:阶梯博弈:先借用别人的一幅图片。(1阶梯之前还有一个0阶梯未画出)阶梯博弈的最初定义是这样的:每一个阶梯只能向它的前一个阶梯移动本阶梯的点,直至最后无法移动的为输。那么,利用NIM,只计算奇数级的异或和,当为0时,先手必败。(至于为什么有这样的,我也能说明白,但下文要讨论的是怎么做)。假设这样个NI...
阅读全文
摘要:翻硬币游戏,纯。。注意要判重 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 int a[105],n; 8 9 int sg(int x){10 int tmp=x,cnt=0;11 ...
阅读全文
摘要:1 //本来写了个和1021相同的HASH,但没过,于是,抱着侥幸的心理,把它变成距离的四次方, 2 //我就呵呵了。。。 3 //这个题,完全靠概率。当然了,如果是把图翻转来比较,也是可以的。但好像很麻烦。。 4 5 #include 6 #include 7 #inclu...
阅读全文
摘要:报告见代码。。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int MAX=105; 8 int dir[4][2]={1,0,-1,0,0,1,0,-1}; 9...
阅读全文
摘要:就是必胜点与必败点的计算而已。计算每一种情况。设st[i][j]为在第i个人剩下j个石头时的情况,拿它转移后的情况比较。可以到达必败点,则当前为必胜点。若只能到达必胜点,则当前点为必败点。 1 #include 2 #include 3 using namespace std; 4 const ...
阅读全文
摘要:1 #include 2 #include 3 #include 4 using namespace std; 5 int a[30]={-1,1,2,3,-1,1,2,-1,-1,2,2,4,5,5,-1,1,2,6,2,3,-1,1,-1,2,-1,2}; 6 char s[25]; i...
阅读全文
摘要:也算是一道模板题吧,只需按照SG函数的定义求出每个值的SG,然后异或就可以了。 1 #include 2 #include 3 #include 4 5 using namespace std; 6 const int N=10005; 7 int sg[N]; 8 bool vis[N];...
阅读全文

浙公网安备 33010602011771号