随笔分类 -  Algorithm

摘要:今天无聊拿起《编程之美》看了下,发现原来n&(n-1)还有很多妙用。n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000可以看到原本最低位为1的那位变为0。弄明白了n&(n-1... 阅读全文
posted @ 2014-06-10 09:29 FREE小宝 阅读(234) 评论(0) 推荐(0)
摘要:今天数据结构的考试有这个题,做了好久,下来后,我好好地在网上查了一下,并结合我自己的理解,总结出来了一个比较好理解的方法。这个方法可以说做起这样的题又快又准。(概括为一个口诀:先序放中间,中序分两边) 基本思想就是递归:1.取出先序的第一个节点。(先序中的节点为根节点)2.用第一个节点可以将中序分... 阅读全文
posted @ 2014-06-06 13:34 FREE小宝 阅读(2119) 评论(1) 推荐(1)
摘要:要尽情的享受学习的过程! 昨天在听报告的时候学习了贪心算法,今天终于写了一到关于贪心算法的题目,虽然是最简单的。题目是典型的部分背包问题。用了一下快速排序。从中学到了如何对结构体进行排序,还有双精度的排序。因为cmp函数的返回值只能是int型的,所以不能只有一个return a-b ; ,是要返回一个整数的。所以就要判断一下就可以了,可以用一个开关语句就可以了。#include #include #define N 1010typedef struct link{ int j ; int f ; double price ;}Food ;int cmp( const void *a, con. 阅读全文
posted @ 2014-03-18 22:06 FREE小宝 阅读(424) 评论(0) 推荐(0)
摘要:还要注意的是考虑相邻二个命令都在一个楼层每一次命令从0开始。。。#includeusingnamespacestd;intmain(){intN;while(cin>>N){inttime=0,from=0,to=0;if(N==0)break;for(inti=0;i>to;if(to>from)time+=(to-from)*6+5;elsetime+=(from-to)*4+5;from=to;}cout<<time<<endl;}} 阅读全文
posted @ 2014-03-18 21:44 FREE小宝 阅读(121) 评论(0) 推荐(0)
摘要:#include #include using namespace std;const double UB=43200;const double hm=11.0/120,hs=719.0/120,sm=59.0/10;const double T_hm=UB/11,T_hs=UB/719,T_sm=3600.0/59;int main(){double d;double s[3],e[3],ts[3],te[3];while(scanf("%lf",&d),d!=-1){s[0]=d/hm;s[1]=d/hs;s[2]=d/sm;e[0]=(360-d)/hm;e[ 阅读全文
posted @ 2014-03-18 18:52 FREE小宝 阅读(343) 评论(0) 推荐(0)
摘要:一 问题描述假设平面内有N个点,每个点以坐标(x, y)给出,N的数据量很大,如何求出其中最近的两个点。二 算法一种方法是暴力,通过枚举任意两个点,找到最小的,一共要比较C(n, 2)次,故实践复杂度为O(n2)。另外一种解法用到了分治的思想,步骤为:把所有点按x坐标的大小排序,从中间一份为二。最近点对有三种情况,都在左边,都在右边,左右都有递归求出都在左边和都在右边的情况,选一个最小值curmin。然后求出两边各有一个的情况得结果为tmp,求法请参考给个链接http://www.cnblogs.com/king1302217/archive/2010/07/08/1773413.html取t 阅读全文
posted @ 2014-03-18 18:46 FREE小宝 阅读(342) 评论(0) 推荐(0)
摘要:#include#include#includeusing namespace std;struct Matrix{ int s[2][2];}h;int A,B,n;Matrix Mul(Matrix a,Matrix b){ Matrix h; int i,j,k; memset(h.s,0,sizeof(h.s)); for (k=0;k<2;k++) for (i=0;i<2;i++) for (j=0;j<2;j++) h.s[i][j]=(h.s[i][j]+... 阅读全文
posted @ 2014-03-17 20:34 FREE小宝 阅读(185) 评论(0) 推荐(0)
摘要:#include #include #include "string.h"using namespace std; int main(int argc, char* argv[]){ int a=1; while(a) { cin>>a; if (a==0) { break; } else { char (*temp)[16]=new char[a][16]; int *num=new int[a]; memset(num, 0, sizeof(int)*a); for (int i=0;i>temp[i]; for (int j=0;j<=i;j+ 阅读全文
posted @ 2014-03-17 19:49 FREE小宝 阅读(122) 评论(0) 推荐(0)
摘要:#include #includeusing namespace std;int main(){ int N; while(cin>>N) { for(int k=1;k>n; int i,j,beg,end,max=-11111111,sum,fig; for(i=j=1,sum=0;j>fig; sum+=fig; if(sum>max) { max=sum; beg=i; end=j; }//a只在此处改变beg,和end 的大小 if(sum<0) { i=j+1; su... 阅读全文
posted @ 2014-03-17 18:53 FREE小宝 阅读(167) 评论(0) 推荐(0)
摘要:#include #include using namespace std;int main(){ int T, count_T; char a[1001], b[1001], ans[1002]; cin >> T; for(count_T=1; count_T > a >> b; int la=strlen(a)-1, lb=strlen(b)-1, sign=0, i; for(i=0;la>=0 && lb>=0; la--,lb--,i++) { sign += a[la] + b[lb] - '0... 阅读全文
posted @ 2014-03-16 21:22 FREE小宝 阅读(213) 评论(0) 推荐(0)
摘要:陷阱1:输出两个空行陷阱2:使用求和公式看两段代码:第一段:利用循环intn,sum;while(scanf("%d",&n)!=EOF){sum=0;while(n)sum+=n--;printf("%d\n\n",sum);}第二段:利用求和公式intn,sum;while(scanf("%d",&n)!=EOF){printf("%d\n\n",n*(n+1)/2);}Youmayassumetheresultwillbeintherangeof32-bitsignedinteger.这句话是 阅读全文
posted @ 2014-03-16 20:08 FREE小宝 阅读(264) 评论(0) 推荐(0)
摘要:#includeint main(){int i, j;while(scanf("%d%d", &i, &j) == 2)printf("%d\n", i + j);return 0;}关键循环读取 阅读全文
posted @ 2014-03-16 20:05 FREE小宝 阅读(124) 评论(0) 推荐(0)
摘要:LanguageCC++PascalTo read numbersint n;while(scanf("%d", &n) != EOF){ ...}int n;while (cin >> n){ ...}var n: integer;...while not seekeof dobegin read(n); ...end;To read charactersint c;while ((c = getchar()) != EOF){ ...}char c;while (cin.get(c)){ ...}var c: char;...while not eo 阅读全文
posted @ 2014-03-16 20:04 FREE小宝 阅读(164) 评论(0) 推荐(0)
摘要:全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何n个字符集的排列都可以与1~n的n个数字的排列一一对应,因此在此就以n个数字的排列为例说明排列的生成法。n个字符的全体排列之间存在一个确定的线性顺序关系。所有的排列中除最后一个排列外,都有一个后继;除第一个排列外,都有一个前驱。每个排列的后继都可以从 它 的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。1.字典序列字典序法中,对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 1235 阅读全文
posted @ 2014-03-10 16:08 FREE小宝 阅读(391) 评论(0) 推荐(0)
摘要:上一篇文章,我介绍了KMP算法。但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法。Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。下面,我根据Moore教授自己的例子来解释这种算法。1.假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。2.首先,"字符串"与" 阅读全文
posted @ 2013-12-10 13:55 FREE小宝 阅读(155) 评论(0) 推荐(0)
摘要:字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。1.首先,字符串"BBC ABCDAB ABCD 阅读全文
posted @ 2013-12-10 13:46 FREE小宝 阅读(143) 评论(0) 推荐(0)