HDU2141 Can you find it?(搜索,二分)
摘要:题目链接。分析:一看这题还以为是暴搜呢。果断TLE。第二次将三个数组合并,二分查找,MLE。最后将两个两个数组合并,二分查找 AC。。。不容易啊。AC代码如下:#include <stdio.h>#include <stdlib.h>#define MAXN 510int l, m, n;int num1[MAXN], num2[MAXN], num3[MAXN], num4[MAXN*MAXN];int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(){ int fl
阅读全文
posted @
2013-02-25 17:34
Still_Raining
阅读(156)
推荐(0)
HDU1253 胜利大逃亡(搜索)
摘要:题目链接。这题就是BFS。也挺水的。。看见这个时间差了吗。。很可惜。这并不是减枝。。只是同样的代码,用不同的编译器发罢了(汗。)。#include <stdio.h>#define MAXN 52typedef struct Pos{ int x, y, z; int cur;}Pos;int a, b, c;int G[MAXN][MAXN][MAXN], vis[MAXN][MAXN][MAXN];Pos queue[MAXN*MAXN*MAXN];int dx[] = {0, 0, 0, 0, 1, -1};int dy[] = {0, 0, 1, -1, 0, 0};int
阅读全文
posted @
2013-02-25 17:19
Still_Raining
阅读(286)
推荐(0)
HDU1312 Red and Black(搜索)
摘要:题目链接。分析:水题,直接BFS或者DFS。dfs:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 22char G[MAXN][MAXN];int vis[MAXN][MAXN], cnt, m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};void dfs(int x, int y){ int d; for(d=0; d<4; d++){ int nx = x+dx[d], ny = y+dy[d
阅读全文
posted @
2013-02-25 16:37
Still_Raining
阅读(487)
推荐(0)
HDU1723 Distribute Message(dp)
摘要:题目链接。分析:水题,简单DP。经过这么几天的努力,回头再看这些曾经被认为是“难题”的题, 确实感觉到了自己的进步。。但,进步永不会停止。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 35int dp[MAXN];int main(){ int n, m, i, j; while(scanf("%d %d", &n, &m) == 2 && (n != 0 || m != 0)){ memset(dp, 0, siz
阅读全文
posted @
2013-02-24 16:25
Still_Raining
阅读(191)
推荐(0)
POJ2230 Watchcow(欧拉回路)
摘要:题目链接。分析:n个点,m条边,每条边仅且经过两次,输出路径。题目保证了必然存在一条这样的边,那么直接dfs搜索,搜索的时候把next标记下就可以了。不过虽然参考别人的过了,还是遇到很多问题,要仔细琢磨琢磨了。#include <stdio.h>#define MAXN 10010#define MAXM 100010struct node{ int to; int next;}edge[MAXM];int head[MAXN], t, vis[MAXM];void Init(int n, int m){ int i; t = 0; for(i=1; i<=n; ...
阅读全文
posted @
2013-02-24 10:46
Still_Raining
阅读(208)
推荐(0)
POJ1386Play on Words(欧拉回路)
摘要:题目地址。分析:1.图必须是连通的。2.欧拉道路或者是欧拉回路都是可以的。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 27int hash[MAXN], in[MAXN], out[MAXN], p[MAXN];void Init(){ int i; for(i=0; i<MAXN; i++){ hash[i] = in[i] = out[i] = 0; p[i] = i; }}int find(int x){return p[x] == x ? x : ..
阅读全文
posted @
2013-02-23 20:35
Still_Raining
阅读(302)
推荐(0)
HDU1247Hat’s Words(字典树)
摘要:题目链接。解题报告:静态分配是比动态分配省时的。静态分配耗时:动态分配耗时:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 26typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}TrieNode;TrieNode mem[500000];int pn;TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = &mem[pn++]; p-&g
阅读全文
posted @
2013-02-20 21:12
Still_Raining
阅读(339)
推荐(0)
HDU1305Immediate Decodability(字典树)
摘要:题目链接。解题报告:现在假定两个字符串A,B。 A的长度小于B。分两种情况,当B先输入时(即长的先输入),途经的结点的flag如果为1,即如果有小于B的单词,便为前缀。当A先输入时(即短的先输入),当建立到A的最后一个字符时, 如果该结点已存在,那么证明,已有一个以该字符为前缀的字符已经输入。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 2typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}T
阅读全文
posted @
2013-02-20 20:59
Still_Raining
阅读(425)
推荐(0)
SDUT1500Message Flood(字典树)
摘要:题目链接。结题报告:模板题。我用的动态分配内存。。每一组数据操作完都要释放内存。。否则的话。会Memory Limit Exceeded的。#include <stdio.h>#include <stdlib.h>#define MAXN 26typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}TrieNode;TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = (TrieNode *)malloc(sizeof(TrieNode)); ...
阅读全文
posted @
2013-02-20 09:51
Still_Raining
阅读(236)
推荐(0)
树专题(集训)
摘要:数据结构上机测试4.1:二叉树的遍历与应用1View Code #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 200 void build(int n, char *s1, char *s2, char *s){ if(n<=0) return; int p = strchr(s2, s1[0]) - s2; build(p, s1+1, s2, s); build(n-p-1, s1+p+1, s2+p+1, s+p); s[n-...
阅读全文
posted @
2013-02-19 15:13
Still_Raining
阅读(206)
推荐(0)
SDUT2132算术表达式转换成后缀式(表达式树)
摘要:题目链接。解题报告:这是很久前做的了。。又扒出来了。。怕再忘了嘛。。很简单。建立表达式树,然后后序遍历。代码如下:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXN 200 int comp(char a, char b); int st1[MAXN], st2[MAXN]; int main(){ int top1 = 0, top2 = 0, i=0; char s[MAXN]; scanf("%s&qu
阅读全文
posted @
2013-02-19 09:33
Still_Raining
阅读(500)
推荐(0)
HDU1162Eddy's picture(最小生成树)
摘要:题目链接。解题报告:用了两个方法。。一个是Kruskal, 一个是prim。对于本题。。还是prim写起来容易点。。Kruskal:prim:。。直接上代码Kruskal AC代码:#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAXN 100typedef struct Pointer{ double x, y;}Pointer;struct Num{ int x, y; double dis;}num[MAXN*(MAXN-1)/2];Pointer pos[MAXN];int
阅读全文
posted @
2013-02-15 20:24
Still_Raining
阅读(209)
推荐(0)
HDU3342Legal or Not(拓扑)
摘要:题目链接。解题报告:拓扑水题一道。1.DFS检测是否有环。#include <stdio.h>#include <string.h>#define MAXN 110int G[MAXN][MAXN], v[MAXN];int n, m;int dfs(int u){ v[u] = -1; int i; for(i=0; i<n; i++)if(G[u][i]){ if(v[i] < 0) return 0; if(!v[i] && !dfs(i)) return 0; } v[u] = 1; return 1;}int topos...
阅读全文
posted @
2013-02-14 17:21
Still_Raining
阅读(218)
推荐(0)
HDU1285确定比赛名次(拓扑排序)
摘要:题目链接解题报告:这题小意思。。啦 啦啦#include <stdio.h>#include <string.h>#define MAXN 600int n, m, indegree[MAXN], G[MAXN][MAXN], q[MAXN];int toposort(){ int i, j, k; i=0; while(i<n){ for(j=1; j<=n; j++){ if(indegree[j] == 0){ indegree[j]--; q[i++] = j; ...
阅读全文
posted @
2013-02-14 16:05
Still_Raining
阅读(1084)
推荐(0)
HDU1069Monkey and Banana(DP)
摘要:题目连接解题报告:各种错误,各种纠正。。自我感觉对DP的理解入门些了。第一种思路是从i结点出发所能达到的最大高度,状态转移方程为dp[i] = dim[i]+max{dp[j]}, 其中G[i][j]=1,即j能放在i上。AC代码如下:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 91struct{ int x, y, z;}dim[MAXN*3];int dp[MAXN], G[MAXN][MAXN], _index;void _swap(int
阅读全文
posted @
2013-02-12 23:40
Still_Raining
阅读(162)
推荐(0)
HDU2602Bone Collector(DP,0/1背包)
摘要:题目连接解题报告:结合算法竞赛入门经典(刘汝佳), 算法设计与分析(郑宗汉,郑晓明)花了一天才算弄懂0/1背包思想,当然仅仅是入门而已给定一个载重量为M, n个重量为wi,价值为pi的物体,1<=i<=n, 每个物品xi都有两种状态,即放入(0)和不放入(1),即xi=0或xi=1使得价值最大。状态转移方程为f[i][j]=max{f[i-1][j],f[i-1][v-w[i]]+p[i]}一篇博客介绍的相当不错。(里面介绍的思路(设的变量名称可能会不一样):问题的特点是:每种物品一件,可以选择放1或不放0。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可
阅读全文
posted @
2013-02-11 22:35
Still_Raining
阅读(316)
推荐(1)
HDU1257最少拦截系统
摘要:题目连接(点我查看).琢磨了一天。。竟然有人说这是水题。。解题报告:首先要弄懂最长上升子序列,可以看下征南同学的博客(点击链接)。本题呢。例如对于6 7 5 1 3 2 4先将7放入数组【0】, 然后看5,因为5<=7,更新数组, 数组[0] = 5,接着看剩下的1,3,2。用1更新【0】,然后3>1,所以放在【1】中,2更新【1】,4>1,4>2,4放在【2】,这样呢。就需要2+1套拦截系统。该思路代码如下。#include <iostream> #include <cstdlib> #include <cstdio> #inclu
阅读全文
posted @
2013-02-10 19:57
Still_Raining
阅读(179)
推荐(0)
HDU1058Humble Numbers(DP)
摘要:转到题目。解题分析:既然让求因子只能为2357的数, 那么分别看2357的倍数就OK了。另外。输出时要注意st(first), nd(secend), rd(third)因为11,12,13时为th 所以111和101也是不同的代码如下:#include <stdio.h>#define n 5900int hum[n];int min_num(int a, int b, int c, int d){ int t = a; if(t>b) t = b; if(t>c) t = c; if(t>d) t = d; return t;}int main(){ i...
阅读全文
posted @
2013-02-08 15:56
Still_Raining
阅读(260)
推荐(0)
HDU1869六度分离(最短路floyd)
摘要:题目链接。分析:只要将互相认识的人之间的权值赋值为1,并用Floyd算法然后检查任意两人间的最短路是否大于7即可#include <stdio.h>#include <string.h>#define MAXN 110const int INF = (1<<28);int w[MAXN][MAXN], d[MAXN][MAXN];void Floyd(int n){ int i, j, k; for(i=0; i<n; i++){ for(j=0; j<n; j++){ if(w[i][j] != INF) d[i][j] = w[i][j];.
阅读全文
posted @
2013-02-05 15:13
Still_Raining
阅读(191)
推荐(0)
HDU2066一个人的旅行(最短路Dijkstra(枚举), Floyd)
摘要:一个人的旅行Problem Description虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可
阅读全文
posted @
2013-02-05 12:07
Still_Raining
阅读(395)
推荐(0)