算法
文章平均质量分 67
mtawaken
这个作者很懒,什么都没留下…
展开
-
ACM
国内的online judge:ZOJ: http://acm.zju.edu.cn/ (浙大的,老牌OJ)POJ: http://acm.pku.edu.cn/JudgeOnline/ (北大的,不错)TOJ: http://acm.tju.edu.cn/ (天大的,不错)HDJ:http://acm.hdu.edu.cn/ (杭电的,不错)国外的:https://www.spoj.pl/ (波兰,不错)http://acm.timus.ru/ (俄罗斯,不错)htt原创 2011-01-09 15:54:00 · 714 阅读 · 0 评论 -
poj2109
看到1101 我就去想大数操作了,后来看了discuss原来double完全可以放。类型 长度 (bit) 有效数字 绝对值范围float 32 6~7 10^(-37) ~ 10^38double 64原创 2012-03-11 13:36:07 · 3421 阅读 · 3 评论 -
poj2255
就是前序中序变后序,以前用JAVA写过一个,是先建树然后后序遍历,其实解析前序中序的建树过程本身也是对树的遍历过程,因此可以把建树直接替换成输出,调整成后序的顺序,就可以了。另外scanf("%d%d", &a, &b);如果a和b都被成功读入,那么scanf的返回值就是2如果只有a被成功读入,返回值为1如果a和b都未被成功读入,返回值为0如果遇到错误或遇到end of f原创 2012-03-14 11:56:24 · 1290 阅读 · 0 评论 -
RMQ问题的ST算法
来源:http://www.cnblogs.com/ljsspace/archive/2011/08/04/2127317.html他博客里好多在线算法,本篇是计算O(1)时间查询无序数组某段的最小值。ST(Sparse Table)算法的基本思想是,预先计算从起点A[i]开始长度为2的j次方(j=0,1...logn)的区间的最小值,然后在查询时将任何一个区间A[i..j]划分为转载 2012-03-22 20:21:31 · 574 阅读 · 0 评论 -
有25匹马选出top3
有25匹马,每匹马都以恒定的速度赛跑,当然马与马之间的速度是不相等的,总共有5个赛道,就是说每轮最多只能有5个马同时赛跑。问题是:要确定出跑的最快的前三名马,需要最少多少轮比赛?7场的方案 分5组 比赛5次 (ABCDE)决出 A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4转载 2012-04-07 19:11:52 · 2200 阅读 · 0 评论 -
poj1080
#include#includeusing namespace std;int times;char a[101],b[101];int a_size,b_size;int result[101][101];int table[5][5]={ {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2}, {-1,-2,-2,5,-1},原创 2012-04-14 10:25:18 · 568 阅读 · 0 评论 -
poj 3274
#include#includeusing namespace std;#define N 100003int n,k,tmp,mask,sum,jump,res;int arr[100005][35];int h[N];bool same;int main(){ //streambuf *backup; // ifstream fin; // fin.原创 2012-04-19 15:58:07 · 516 阅读 · 0 评论 -
【搜索】HDU1016
DFS搜索,实现做预处理可以加快速度。1. 由于02. 可以事先算出每个数可以与哪些数组合,直接使用减少for循环次数 JAVA版当输出数据量大时不要使用System.out,使用PrintWriter。以前用System.out一直4000MS TLE,用PrintWriter是600MSimport java.io.IOException;原创 2013-07-17 10:06:20 · 974 阅读 · 0 评论 -
利用对手论证法证明中位数问题的比较次数下界[ZZ]
<br /><br />5个数通过6次比较求中位数的方法如下:<br />5个数之间的大小关系构成的一个树形图T。T中的一个结点代表一个数,而一条边代表它所关联的两个数的大小关系,T的根就是中位数。显然T中的一条边要由一次比赛来确定。在下面的图中,如果x大于y,则节点x在节点y的上方且x和y有一条边相连。另外,*表示一般的数,o表示下一次即将进行比较的两个数。<br />第1步,先任取两个数比较,结果为:<br /> *<br /> |<br /> * o o *<br />第2步,翻译 2010-10-12 17:07:00 · 1039 阅读 · 0 评论 -
poj1423
公式直接算的,取对数的会超时。#include#includeusing namespace std;int input;int log(int n){double sum=0;int i;for(int i=2;isum+=log10(1.0*i); }return (int)sum+1;}int stirling(int n)原创 2012-03-10 10:27:14 · 579 阅读 · 0 评论 -
外排之多路归并的败者树
编程珠玑第一个case是有关一个技巧性解决外部排序问题的。问题很巧妙的解决了,但一开始提到的利用归并排序进行外部排序的算法仍值得仔细探究一下,毕竟本科时学的不是很深入。 先来看内部排序中最简单的2路归并排序算法。 算法核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,给定数组中序列界限i、m、n,用2个下标变量分别从i和j=m+1开始逐个往后处理,先比较,小的写到转载 2012-10-30 20:34:45 · 1176 阅读 · 0 评论 -
理解矩阵(三)
转自孟岩的文章:http://blog.csdn.net/myan/article/details/1865397 理解矩阵(一) 理解矩阵(二) 这两篇文章发表于去年的4月。在第二部分结束的时候,我说: “矩阵不仅可以作为线性变换的描述,而且可以作为一组基的描述。而 作为变换的矩阵,不但可以把线性空间中的一个点给变换到另一个点去转载 2012-09-06 20:57:47 · 1257 阅读 · 0 评论 -
poj3299
Source CodeProblem: 3299 User: mtawakenMemory: 200K Time: 0MSLanguage: C++ Result: AcceptedSource原创 2011-09-16 15:04:33 · 931 阅读 · 0 评论 -
poj2159
Source CodeProblem: 2159 User: mtawakenMemory: 164K Time: 16MSLanguage: C++ Result: AcceptedSource原创 2011-09-16 16:15:38 · 602 阅读 · 0 评论 -
poj1753
#includeusing namespace std;int board[4][4];bool occurance[1<<16];int root=0;class Node{public:int status;int step;};class Queue{public:Queue():rear(0),head(0){};Node nodes[1<<16];void p原创 2012-03-05 22:34:43 · 466 阅读 · 0 评论 -
poj1068
我写的就是先由P还原出括号排列,然后再遍历一次输出W形式的结果。代码不在身边。在discuss中看到一个精简版的,分析了一下思路:将P中值相同的分成一类,在每一类集合代表该类中的右括号之前有X个左括号,由于P中数字是递增的,所以X也是递增的。设立数组a,a[i]=k表示左边有i个左括号的右括号集合已经消耗了从右向左数(因为是就近匹配)的k个括号。每读入p的一个新数字m,它要么1原创 2012-03-14 19:41:02 · 1069 阅读 · 0 评论 -
poj1083
#include#includeusing namespace std;int t,size,count,a[201],b[201],c[201],p;int main(){ //streambuf *backup; // ifstream fin; // fin.open("data.in"); // backup = cin.rdbuf(); // ba原创 2012-03-19 11:14:20 · 1105 阅读 · 1 评论 -
poj1694
#include#includeusing namespace std;int M,N,size,node[200][200],input,remain,num;int post(int index){ if(node[index][0]==0) return 1; int* need = new int[node[index][0]]; for(int i=0;i<node[i原创 2012-03-21 15:05:55 · 761 阅读 · 0 评论 -
poj 1573
模拟题#include#includeusing namespace std;int m,n,in,path[12][12],x,y,c1,c2;char board[12][12];char c;bool proceed(){ if(xm||yn){ c1=path[x][y]-1; c2=0; return false; } int x1,y1; x1=x;原创 2012-04-16 20:29:42 · 437 阅读 · 0 评论 -
poj 3349
1. 采用hash方法,size要是一个大质数。这样可以减少碰撞。2. hash函数从discuss摘抄如下:1. 直接相加, 把(总和%大质数)为key.2. 平方和相加, 把(总和%大质数)为key.3. 从小到大的顺序, 对v[i]<<(i*3)依次异或, 然后模一个大质数作为key.(by hust07p43)4. 六个数中非零数的积再乘上一个大质数,然后模一个100w上原创 2012-04-18 20:35:34 · 511 阅读 · 0 评论 -
理解矩阵(一)(二)
转自孟岩的博客:http://blog.csdn.net/myan/article留在这里做个保存。前不久chensh出于不可告人的目的,要充当老师,教别人线性代数。于是我被揪住就线性代数中一些务虚性的问题与他讨论了几次。很明显,chensh觉得,要让自己在讲线性代数的时候不被那位强势的学生认为是神经病,还是比较难的事情。可怜的chensh,谁让你趟这个地雷阵?!色令智昏啊转载 2012-09-06 20:56:26 · 1076 阅读 · 0 评论 -
【搜索】HDU1495
如果找到规律,运行起来很快。规律是:两个杯子按大小排序,为S>M>N,1.只要n满了,就把n里的东西放到s中2.只要m非空,就把m中的放到n中3.如果m为空,把s中的放到m中。 但是这道题本意是让机器来搜索的。用BFS,注意hash和剪枝。Queue用Java自带的LinkedList。 HDU现在超好,有题目分类,有discuss,还能保存你提交的代码原创 2013-07-16 16:52:43 · 1258 阅读 · 0 评论 -
poj2411
在人指导下第一次做,提交了10次才AC。汗颜啊。错点1:main函数必须返回int,不然“格式错误”错点2:让是否继续有测试用例为循环条件,不然“超时”。错点3:没考虑到number结果可能非常大,int不够,要用long long,输出使用%I64d。不然“结果错误原创 2011-09-15 21:47:59 · 2317 阅读 · 0 评论 -
poj1012
#includeusing namespace std;int good,bad,input,m,shift,temp,flag;int data[15];int main(){ cin>>input; memset(data,0,sizeof(data)); while(input!=0){ m=input; if(data[input]==0){ while(tr原创 2012-03-10 14:49:22 · 431 阅读 · 0 评论 -
P,NP,NP-hard,NPC
P问题是一类问题,它们可以找到一个多项式复杂度的确定性算法。这意味着,在给定有限的资源(计算机)内,资源运用该算法能在多项式时间内得到问题的正确解。NP问题要比P问题更加广泛,它定义为一类问题,它们可以找到多项式复杂度的非确定算法。P属于NP,即如果一个问题可以找到多项式复杂度的确定性算法,那一定有多项式复杂度的非确定性算法。然而NP属于P却并没有证明,因为对于一个NP问题,我原创 2011-01-05 20:58:00 · 2831 阅读 · 3 评论 -
poj2549
一开始思路是从N个数中取出3个,然后搜索是否distinct的和在S中。用DFS。TLE。后来改变思路先在S中找和,然后再找xyz。找xyz的方法可以是遍历x,y用二分法找z,也可以是3SUM方法。#include#includeusing namespace std;int *arr;int size,input,dest,x,y,z,flag,sum;int main(){原创 2012-03-09 12:53:29 · 1196 阅读 · 0 评论 -
贴几个常用小程序代码,大都递归的
1. 八皇后public class Test { public int []cols=new int[9]; public int count=0; public boolean check(int line,int i){ int x=i; int y=line; while(x>0&&y>0){原创 2012-03-06 17:08:20 · 1008 阅读 · 0 评论 -
poj2965
BFS版结果对的,但是TLE#includeint board[5][5];int rootStatus;static const int SIZE=1<<16;bool occurance[SIZE];struct Node{ int s,c,i,j,pre; };class Queue{public: Queue():head(0),rear(0){ for(原创 2012-03-08 10:46:26 · 2262 阅读 · 1 评论 -
poj1328
将问题转化为区间重合的问题,将区间按点的x坐标排序,从左到右计算,如果当前区间跟之前计算的区间有重合部分,则把交集作为新区间,否则则表明需要另新建一个圆,把当前区间规定为新区间,并把圆个数+1.出了几处错误:1.要判断d#include#include#includeusing namespace std;struct Point{ float x,y;};int原创 2012-03-10 21:13:18 · 1847 阅读 · 0 评论 -
poj 2586
#include//22386 31673using namespace std;int get(int value,int index){ return (value>>index)&1;}int main(){ int s,d,sum,flag,fflag,i,j,k; int max=(1<<12); while(cin>>s>>d){ fflag=0; fo原创 2012-03-11 22:21:29 · 599 阅读 · 0 评论 -
poj1700
很自然想到贪心,一种思路是由于必须有人把船开回来,尽量把这个时间缩短,因此总是让最快的陪同最慢的过去,然后最快的驾船回来。但是这样每个比最快的慢的时间都要算进去。于是想到可以让最慢的和次慢的一起走,这样虽然消耗了最慢的时间,但是不用再消耗次慢的时间。这样必须有人把船开回来,而且绝不能是次慢的这个,因此可以先让最快次快的去一次,让最快的回来,次快的留下预备用。这样相当于每次运最慢的之前首原创 2012-03-17 14:50:06 · 1589 阅读 · 0 评论 -
poj2201
构建笛卡尔树1. 分析数据递归构建树,花费时间较长。2. 在空树基础上不断插入。 建立node数组,0放a足够小的头,1~N放数据并按k有小到大排序。从1开始插入到只有空头的笛卡尔树中。由于k的有序,对第i个,它要么是i-1的右节点,要么是i-1的父节点的右节点。。。根据a值(最小堆)的特点找到合适的节点j,则i是j的右节点。j原先的右子树自然变成了i的左子树,再维护好paren原创 2012-03-22 19:40:39 · 633 阅读 · 0 评论 -
poj1598
#include#includeusing namespace std;int k,e,num[20],index,temp,m,times;char keys[20][25],excuses[20][100],*str;bool checkAlp(char x){ if(x'z'||(x>'Z'&&x<'a')) return false; return true;}int原创 2012-03-23 16:28:44 · 1034 阅读 · 0 评论 -
poj1002
统计重复个数,很容易想到hash,建立一个int数组,把电话号码的数字形式作为hashcode,数组记录出现的次数。当有海量数据计算重复次数的时候,我们经常这么做,因为数据量相对于hashcode的范围来说是很大的,所以利用hash数组保存出现次数是划算的。但是这道题hashcode的范围是0~1000000,而n与hashcode相当或更小,这时候hash数组平均下来就会有很多空间被浪费原创 2012-04-23 13:53:06 · 442 阅读 · 0 评论 -
poj 2192
依然是字符串的dp,这回建Bool数组dp,dp[i][j]=1表示第一串的前i个和第二串的前j个匹配。计算dp[i][j],如果a[i]与b[j]相同,则选择一个跟c匹配,只要其子问题dp[i-1][j](选a的进行匹配)或dp[i][j-1](选b的进行匹配)有一个为真就可以。如果a[i]和b[j]不相同,则看哪一个能匹配,如果能匹配,则相应的子问题能匹配就可以,如果不能匹配,直接为f原创 2012-04-15 22:08:35 · 501 阅读 · 0 评论 -
poj1828
#include#includeusing namespace std;typedef struct Node{ int x,y;} Node;bool cmp(const Node& a,const Node& b){ if(a.x==b.x) return a.y<b.y; return a.x<b.x;}int N,ans,mx,my;Node nodes[5000原创 2012-03-21 19:56:31 · 702 阅读 · 0 评论 -
杭电1995
群里有人问,我就去做了下。汉诺塔这方面的问题以前也没有考虑过,不过这种肯定是有章可循的。最先想到的是在汉诺塔move的步骤上检查一下index,如果是所要求的计数就加1.不过递归方法n=20以上效率就明显降下来了。汉诺塔的递推式是f(n)=2*f(n-1)+1,这个从递归的方法中也可以总结出来。不过用来当非递归方法可以,对于这道题就用不上了。对题中的例子手算了一下,原创 2012-04-06 14:50:14 · 877 阅读 · 0 评论 -
对网上最大字段和dp解法建模的勘误
设有array[1~n],求最大字段和。而网上的说法是b[j]是array[1~j]的最大字段区间。如果这是子问题,那么当j=n,则b[j]就是最终结果,显然不是这样,不然sum变量是做什么的呢,何况b[n]也没被用来做最终结果。实际上这个问题的线性解法描述应该是这样的。有一串数字,程序从头依次逐个地读取。(1)若这个数是负数,则舍弃继续往下读。(2)如果是正数,则从这个数开始原创 2012-04-13 10:58:21 · 520 阅读 · 0 评论 -
堆排序建堆复杂度为O(n)的证明
今天重温堆排序,在网上搜了好多博客文章,都是泛泛而谈。有的只讲了思路,有的直接贴上一份或几份代码。好一点的对复杂度进行了分析,但是讲到建堆复杂度,就一笔带过或者说请参考算法导论××页。我觉得求建堆复杂度并不难,了解一下对于理解堆排序是有好处的,下文为求解过程。堆排序就是借助于堆的数据结构和堆的操作函数来完成排序功能的过程。堆的数据结构可以借助于数组表示出来并可以高效地进行堆的操作。我们为堆原创 2012-09-10 23:40:40 · 15772 阅读 · 6 评论 -
【搜索】HDU1104
本身只是BFS搜索,需要注意的有几点:1. 题目中的modulus操作与计算机的%不同。modulus(a,b) = (a%b+b)%b。 即保证结果一定为正。而计算机中是先abs(a)%b,再把a符号付给它。2. 在搜索过程中值会越来越大,不便于存入hash数组,由于计算的值总是用于比较modulus(tmp, K)==modulus(N+1,K),因此我们可以不必保存tmp,而直接对t原创 2013-07-18 23:53:36 · 1279 阅读 · 0 评论