
各种OJ
文章平均质量分 58
leohxj
Who cares ?
展开
-
HDU 1042 N!
<br />高精度运算,算法竞赛入门指导上面有一个类似的。本题的N为 [0,10000].<br />10000!=大约要开到40000大小范围的数组,我就是没想到数字要开到这么大,所以WA了。<br />模拟按位运算。也可以套用大数模板运算。<br />这是刘汝佳书上那种:<br />#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXN 4010int s[MAXN];int main(){i原创 2010-11-26 17:08:00 · 574 阅读 · 0 评论 -
Dijkstra 算法
<br /><br />Dijkstra算法:<br />数据:<br />dis[]:记录每个定点的最短路径,初始化dis[s]=0,其他节点dis[]=INF;<br />flag[]:记录定点是否使用。<br />G[][]:邻接矩阵存放图。<br /> <br />算法:<br />dijkstra(int s)<br />{<br /> <br /> for(int i = 0; i < n; i++)<br /> dis[i] = (i ==s?0:INF);<br /> memset(flag原创 2010-11-16 21:31:00 · 402 阅读 · 0 评论 -
POJ 1789 Truck History
<br />不得不说,题目太难看懂了。<br />就是每个卡车都一个编码,每两个卡车的距离是编码不同的位数。<br />求的是最小生成树。<br />用prime算法。<br />AC代码:<br />#include <iostream>#include <stdio.h>#include <string.h>using namespace std;char s[2001][8];int a[2001][2001];bool b[2001];int value[2001];转载 2010-11-15 19:35:00 · 430 阅读 · 0 评论 -
最小生成树:Prim算法
<br /><br />prim 算法<br /> <br />以领接矩阵存储 图G<br />bool b[i]表示顶点i是否被访问,初始化时候memset(b,false,sizeof(b));<br />b[0]=value,表示从第0个节点开始。<br />用value[i] 表示节点i到最小生成树A中定点的最小距离。例如value[1]=a[0][1];<br />int sum记录权值和<br />int min判断最小权值,初始值要设置的大,例如 min = 0xffffff;<br />i原创 2010-11-15 20:15:00 · 428 阅读 · 0 评论 -
POJ 1258 Agri-Net
<br />kurskal算法:<br />#include <iostream>#include <fstream>#include <sstream>#include <algorithm>#include <string>#include <set>#include <map>#include <utility>#include <queue>#include <stack>#include <list>#include <vector>#include转载 2010-11-16 20:03:00 · 363 阅读 · 0 评论 -
POJ 3026 Borg Maze
<br />先用BFS求出路径,在用prim求MST。<br />#include<iostream>#include<queue>#include <stdio.h>#include <string.h>#define MAXN 105#define N 55#define INF 10000000using namespace std;struct node{ int x,y; int step;};int dir[4][2]={{-1,0原创 2010-11-16 20:26:00 · 380 阅读 · 0 评论 -
POJ 1011 Sticks
<br />DFS+减枝<br />所谓减枝,就是不去搜索那些不必要的。<br />这题的减枝方法是:将树枝从大到小排列,从最大的开始枚举。<br />所有长度之和sum一定要是当前枚举的倍数(才能平分)。<br />搜索时候,用标志位use[]记录树枝使用情况。<br />每次搜索,如果遇到加上其余树枝都满足不了的时候,回溯上一层。(后面的没有必要搜索了)<br /> <br />#include <iostream>#include <algorithm>#include <cstring>转载 2010-11-17 21:20:00 · 452 阅读 · 0 评论 -
LCS:最长公共子串
<br /><br />LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置。<br />改进:<br />当字符匹配的时候,我们并不是简单的给相应元素赋上1,而是赋上其左上角元素的值加一。我们用两个标记变量来标记矩阵中值最大的元素的位置,在矩阵生成的过程中来判断当前生成的元素的值是不是最大的,据此来改变标记变量的值,那么到矩阵完成的时候,最长匹配子串的位置原创 2010-11-17 19:38:00 · 542 阅读 · 0 评论 -
算法的力量——李开复
<br /><br />算法的力量<br />算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位转载 2010-11-24 22:37:00 · 923 阅读 · 0 评论 -
HDU 1002
<br />这道题目不难,但是格式有点晕。<br />用大数处理或者字符串都可以,注意最后输出的应该是数字,不是字符串!<br />注意的话,就注意字符串和数字的转换吧。<br />格式的话,最后一组测试不用输出空行。<br /> <br />这题就代表我的水题之旅的开始吧~原创 2010-11-25 13:45:00 · 389 阅读 · 0 评论 -
Uva 10055
#include #include int main(){ long int x1 = 0, x2 = 0, sum = 0; while (scanf("%ld %ld", &x1, &x2) != EOF) { sum = x1 - x2;原创 2011-08-19 23:09:08 · 607 阅读 · 0 评论 -
Kruskal算法 (并查集)
<br /><br />Kruskal算法(并查集)<br />数据:<br />int root[]:存放节点的根,初始化时候全部等于本身。<br />struct node{<br /> int x,y,distance;<br /> void set ( int a, int b, int w ) { x=a,y=b,distance=w; }<br /> }Node[];<br /> :存放图,定点,x,y.距离distance.<br />void cmp():比较函数,给qsor原创 2010-11-16 19:49:00 · 686 阅读 · 0 评论 -
大数的高精度四则运算
看代码吧。#include #include #include using namespace std;inline int compare(string str1, string str2){ if(str1.size() > str2.size()) //长度长的整数大于长度小的整数 return 1; else if(str1.size()转载 2010-11-13 21:29:00 · 873 阅读 · 0 评论 -
HDU 1003
<br />首先,我觉得HDU越来越棒了。#include <stdio.h>int main(){ int iCase; scanf("%d",&iCase); for(int cas = 1; cas <= iCase; cas++) { int sum,n,t,i,j,a,b,max; max = -9999; scanf("%d",&k); sum = 0;原创 2010-11-27 19:35:00 · 917 阅读 · 2 评论 -
HDU 1004
<br />统计字符串,用了map。<br />#include <stdio.h>#include <map>#include <string.h>#include <string>#include <iostream>using namespace std;map<string,int> s;int main(){ int n; while(scanf("%d",&n),n) { int len; string原创 2010-11-27 20:24:00 · 1084 阅读 · 0 评论 -
HDU 1005
<br />注意此题直接递归会由于数据量很大TLE。<br />所以,这样的题目能优化的,存在循环,要找出循环的点。<br />f[i]=f[i-1]=0;<br />#include <stdio.h>#include <string.h>int s[50];int main(){ int a,b,n,i; while(scanf("%d%d%d",&a,&b,&n),a || b || n) { int i; s[0]=s[1原创 2010-11-27 20:44:00 · 1831 阅读 · 1 评论 -
ZOJ 2008 Gnome Tetravex 搜索(DFS)
<br />一道搜索题。DFS搜索。<br />数据:<br />每个小square里面有4个小triangle.用一个iSquare[25][4]的数组存放最多25种可能的小square。<br />如果有重复的,可以用iCount[25]数组记录。每添加一个不同的iSquare,iCount++。<br />用一个iTable[25]数组,记录n*n个位置,能放置的小quare。<br />算法:<br />搜索的话用DFS,对每个位置测试。<br />测试能否放置需要再添加一个函数 , Place(i原创 2010-11-09 20:00:00 · 446 阅读 · 0 评论 -
zoj 1019 Illusive chase
<br />题目比较长,读起来麻烦...英语不好,理解不行。<br />数据:<br />row[i][j],cloumn[i][j]记录i,j左边,上面有多少障碍。<br />追踪旅行的数据结构:<br />struct step<br />{<br /> int x, y;<br /> char direct;<br />}chase[maxTrip];<br />算法:<br />对区间[x,y]进行全面搜索。对每次(x,y),到(x0,y0)之间,判断是否有障碍。<br />ac代码:<br原创 2010-11-10 19:17:00 · 868 阅读 · 0 评论 -
LCS算法
<br /><br />首先将要看到如何运用动态编程查找两个 DNA 序列的最长公共子序列(longest common subsequence,LCS)。发现了新的基因序列的生物学家通常想知道该基因序列与其他哪个序列最相似。查找 LCS 是计算两个序列相似程度的一种方法:LCS 越长,两个序列越相似。<br />子序列中的字符与子字符串中的字符不同,它们不需要是连续的。例如,ACE 是 ABCDE 的子序列,但不是它的子字符串。请看下面两个 DNA 序列:S1 = DE>GCCCTAGCGDE>S2 =转载 2010-11-11 19:59:00 · 29235 阅读 · 10 评论 -
ZOJ 1013 Great Equipment
<br />动态规划,水题。<br />最烦这种题目长的。<br />数据:<br />carry[i][j]数组,存放商队可以放第一种武器i个,第二种j个,第三种carry[i][j]个。最终结果是存放所有装备运输的可能组合。<br />trade[i][j]数组,存放动态规划过程中,到目前为止所有商队,可以运输第一种i个,第二种 j个,第三种trade[i][j]个。<br />AC代码:#include <stdio.h>#include <memory.h>int trade[501][50原创 2010-11-10 20:45:00 · 1675 阅读 · 1 评论 -
ZOJ 1027 Human Gen Functions
<br />LCS问题,自己做的WA了。<br />从网上摘了一个差不多的AC掉了。<br /> <br /><br />解题思路:<br /> 网上一份解题报告:写的很详细,就此摘来:<br />http://nash250.blog.hexun.com/9794371_d.html<br />和《算法导论》中动态规划章节的LCS(Longest common subsequence 最长公共子序列)所用例子基本是一样的,都是测两串基因的相似程度,不同之处在于《导论》用LCS表示两基因的相转载 2010-11-11 19:39:00 · 636 阅读 · 0 评论 -
ZOJ 1074 To The Max
<br />动态规划求二维数组最大连续和。<br />AC代码:<br />#include <stdio.h>#include <string.h>#define N 101int main(){ int a[N][N]; int b[N]; int n; int i, j, k; while(scanf("%d", &n) != EOF) { for(i = 0; i < n; i++)原创 2010-11-11 20:38:00 · 670 阅读 · 0 评论 -
POJ 1861 Network
<br />Kruskal算法求最小生成树。<br />要求输出最小生成树的最大权值。最小边数,和各个边。<br />数据:<br />记录权值的c,最小生成树的边用r1[],r2[]表示。<br />算法:<br />Kruskal算法。并查集。<br /> <br />AC代码:<br />#include<iostream>#include<algorithm>using namespace std;int u[15005], v[15005], w[15005], p[1005], r[原创 2010-11-12 20:26:00 · 485 阅读 · 0 评论 -
Uva 10071
#include int main(){ int v ,t; while (scanf("%d %d", &v, &t) != EOF) { printf("%d\n", 2*v*t); } return 0;}原创 2011-08-19 23:19:20 · 471 阅读 · 0 评论