ACM算法修练之道
ACM算法修练之道 ---- 讲解算法题目,为ACMer提供指导与参考
低调的洋仔
春风桃李花开日,秋雨梧桐叶落时。西宫南内多秋草,落叶满阶红不扫。
展开
-
剑指Offer-二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目解析刚开始看这道题目的时候,比较蒙,大概是因为我一开始就直接看代码,没看到什么细节性质的提示。再读了下题目,基本明白了他的意思,主要意思就是说给你一个序列,你确认下这个序列到底是不是一个二叉搜索树的后序遍历结果。这里稍微讲下,二叉搜索树的概念:根节点原创 2017-06-19 14:51:35 · 1364 阅读 · 0 评论 -
剑指Offer-不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。题目解析题目比较明确,不用加减乘除的方式来计算两个数字的和,应该很自然的想到用与或非等逻辑运算以及位移作为辅助的方式来计算其值。解题思路模拟一个加法的过程5 + 110100 1------110这里面涉及到了进位,如果去掉进位来看,也就是末尾的1+1进位转为0了,那么现在的数为100,然后进位数字为1,进位1位原创 2017-06-19 11:31:06 · 1204 阅读 · 1 评论 -
剑指Offer-求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。题目解析求1到n的和,重点是不能使用乘除、for、while、if、else、switch、case等关键字以及条件判断的语句(A?B:C),那么显然这道题目难度提升了一个台阶,如果没做过这个类型的题目,可能会心中一揪,两眼一把黑。解题思路这里可以通原创 2017-06-16 20:07:49 · 3968 阅读 · 4 评论 -
剑指Offer-从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。题目解析这个题目而言之前好像是遇到过,所以很快就过了,题目的意思应该说比较明确的,就是要求从上到下的将节点输出出来,需要注意的地方是,同一层的节点要从左向右边依次的输出。所以这个题目应该说很明显是一个层次遍历的题目。解题思路层次遍历可以用栈来实现,先把数据入栈,然后出栈,出栈的同时,将其左右子节点也入栈,按照这个题目的意思如果用栈来实现原创 2017-06-16 19:16:29 · 969 阅读 · 0 评论 -
剑指Offer-栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)题目解析题目中要求一个序列是不是另一个序列出栈的诸多顺序中的一种,我一开始想法是先找规律,看看原创 2017-06-16 16:51:16 · 1075 阅读 · 26 评论 -
剑指Offer-五只猴子吃桃子
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 题目分析从开始的第一只猴子开始想,他将桃子分成五份然后多出来一份,剩下的也就是这一堆桃子总数A的(A-1)/5 * 4个桃原创 2017-06-16 15:41:32 · 2024 阅读 · 0 评论 -
剑指Offer-包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。题目解析这个题意思不明确,而且代码给出的部分参不透到底是要干嘛,可能我的理解有问题,经过一番折腾才明白是要自己重新写一个类Stack的类,但是包含min函数,能够自己求出他的最小值。解题思路我觉得这个题目本身含糊不清,题目给出的代码中,引入了Stack这个类,意思就是可以借助Stack来实现一个包含min方法的栈。或许原创 2017-06-16 11:07:28 · 831 阅读 · 0 评论 -
剑指Offer--顺时针打印矩阵问题
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.题目分析这个题目看起来比较简单,但是当你真正去做的时候,很麻烦,亲身体验一把你就懂什么感受了。主要的考察点在于控制顺时针的方向、行原创 2017-06-14 16:03:26 · 960 阅读 · 0 评论 -
求和的问题ACM
#include using namespace std;int main(){ unsigned int sum; while (cin>>sum ) { cout<<(sum+1)*sum/2<<endl<<endl; } return 0;}原创 2013-03-15 17:53:49 · 1412 阅读 · 0 评论 -
A+B问题acm
#include using namespace std;int main(){ int a,b; while(cin>>a>>b) { cout<<a+b<<endl; } return 0;}原创 2013-03-15 18:14:03 · 1381 阅读 · 0 评论 -
1091ACM求和
#include using namespace std;int main(){ int a,b; while(cin>>a>>b&&a!=0||b!=0) { cout<<a+b<<endl; } return 0;}原创 2013-03-15 21:01:13 · 1191 阅读 · 1 评论 -
杭电ACM1092求和问题详解
/*时间: 20120314作者: 烟大洋仔问题:Problem DescriptionYour task is to Calculate the sum of some integers.InputInput contains multiple test cases. Each test case contains a integer N, and then N原创 2013-03-16 19:52:18 · 4999 阅读 · 0 评论 -
ACM杭电的1093求和问题
/*时间: 20120314作者: 烟大洋仔题目: Problem DescriptionYour task is to calculate the sum of some integers.InputInput contains an integer N in the first line, and then N lines follow. Each line s原创 2013-03-16 20:55:50 · 3686 阅读 · 0 评论 -
杭电ACM1094计算A+B的问题
/*时间: 2012.03.14作者: 烟大洋仔题目: Problem DescriptionYour task is to calculate the sum of some integers.InputInput contains multiple test cases, and one case one line. Each case starts w原创 2013-03-16 21:05:17 · 4318 阅读 · 0 评论 -
杭电ACM1095解决A+B问题
/*题目:Problem DescriptionYour task is to Calculate a + b.InputThe input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Out原创 2013-03-16 21:13:29 · 7465 阅读 · 0 评论 -
杭电ACM1096求和问题
#include using namespace std;int main(){ int n,m,a,sum=0; while(cin>>n) { while (n--) { cin>>m; sum=0; while (m--)原创 2013-03-16 21:27:29 · 3503 阅读 · 0 评论 -
杭电Acm1001解决求和的问题
#include using namespace std;int main(){ unsigned int n; while (cin>>n) { cout<<(n+1)*n/2<<endl<<endl; } return 0;}//没出来结果的注意下整形n的无符号原创 2013-03-17 11:48:45 · 1762 阅读 · 0 评论 -
杭电ACM1008电梯问题C++
/*时间:2012.03.17作者:烟大洋仔题目: Problem DescriptionThe highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the原创 2013-03-17 16:07:07 · 9955 阅读 · 3 评论 -
杭电ACM大赛2000关于ASCII码排序的问题
#include using namespace std;int main(){ char a[3]; for (int i=0;i<3;i++) cin>>a[i]; if(a[0]>a[1]) { a[0]=a[0]+a[1]; a[1]=a[0]-a[1]; a[0]=a[0]原创 2013-03-17 19:46:27 · 5185 阅读 · 0 评论 -
杭电ACM2006奇数的乘积
#include using namespace std;int main(){ int n,t,x=1; while(cin>>n) { x=1; while (n--) { cin>>t; if(t%2==1) x=x*t; } cout<<x<<endl; }}原创 2013-03-17 20:27:48 · 3406 阅读 · 2 评论 -
杭电ACM数值统计2008
/*时间: 2012.03.18作者: 烟大洋仔题目: Input输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。 Output对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。 Sample Input6 0 1原创 2013-03-18 17:52:42 · 4120 阅读 · 0 评论 -
杭电ACM1019求最大公约数
#includeusing namespace std;int main(){int gcd(int a,int b); int n,m,a; cin>>n; while(n--) { cin>>m; cin>>a; m--; while (m--) { int b原创 2013-03-18 18:11:12 · 3336 阅读 · 2 评论 -
杭电ACM1108求最小公倍数
#includeusing namespace std;int main(){int gcd(int a,int b); int a,b; while(cin>>a>>b&&a<=1000&&b<=1000) { int c=gcd(a,b); c=a/c*b; cout<<c<<endl; }原创 2013-03-18 19:23:15 · 3023 阅读 · 0 评论 -
杭电ACM2035人见人爱的A^B
#includeusing namespace std;int main(){ int A,B,C=1; while (cin>>A>>B&&A>=1&&B<=10000) { C=1; while(B--) { A=A%1000;原创 2013-03-18 20:02:10 · 2524 阅读 · 0 评论 -
杭电ACM1061N^N求最右边的数的问题
#includeusing namespace std;int main(){ int n; cin>>n; while (n--) { int m; cin>>m; int a[10][5]={ {0,0,0,0,0}, {1,1,1,1,1}, {6,2,原创 2013-03-18 20:24:46 · 2643 阅读 · 2 评论 -
杭电ACM1021裴波纳挈数AGAIN
#includeusing namespace std;int main(){ int n; while(cin>>n&&n < 1000000) if(n%8==2||n%8==6) cout<<"yes"<<endl; else cout<<"no"<<endl; return 0;}原创 2013-03-18 20:41:50 · 1497 阅读 · 0 评论 -
杭电ACm1005求f(n)非递归
#includeusing namespace std;int main(){ int a,b,n,m[1000]; while (cin>>a>>b>>n&&a!=0) { m[1]=m[2]=1; for (int i=3;i<49;i++) m[i]=(a*m[i-1]+b*m[i-2])%7原创 2013-03-18 21:18:48 · 1202 阅读 · 0 评论 -
杭电ACM1071The area---------求积分面积
#include #include using namespace std;int main(){ int t; double x1,y1,x2,y2,x3,y3,a,k,s; cin>>t; while(t--) { cin>>x1>>y1>>x2>>y2>>x3>>y3; a=(y2-y1)/((x2-x1)*(x2-x原创 2013-03-20 14:05:48 · 1609 阅读 · 0 评论 -
杭电ACM吃糖果问题
#include #include using namespace std;int main(){ int n,m,i,k=0; int sum=0; cin>>n; while (n--) { cin>>m; while (m--) { cin>>i;原创 2013-03-20 14:37:21 · 2166 阅读 · 2 评论 -
杭电ACm求数列的和2009
#include #include#include using namespace std;int main(){ double n,m,t=0; while (cin>>n>>m&&n<10000&&m<1000) { t=0; while (m--) { t=t+n原创 2013-03-20 14:53:48 · 1432 阅读 · 0 评论 -
杭电ACM多项式求和--》2011
#include #includeusing namespace std;int main(){ double sum=0; int n,m; scanf("%d",&n); while(n--) { scanf("%d",&m); for(int i=1;i<=m;i++) {原创 2013-03-20 20:35:35 · 1739 阅读 · 0 评论 -
杭电ACM。。。sort
/*Problem Description给你n个整数,请按从大到小的顺序输出其中前m大的数。Input每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。Output对每组测试数据按从大到小的顺序输出前m大的数。Sample Input5 33 -35 92原创 2013-03-20 20:57:05 · 1813 阅读 · 0 评论 -
杭电ACM1004
/*时间: 2013.03.26作者: 烟大洋仔题目:Problem DescriptionContest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges' favorite time is guessing the m原创 2013-03-24 21:01:20 · 1938 阅读 · 0 评论 -
杭电ACM2043密码的问题已经AC
#include #include #include using namespace std;int main(){ char a[50]; int m,k1,k2,k3,k4; unsigned i; cin>>m; getchar(); while(m--) { k1=k2=k3=k4=原创 2013-03-26 15:22:45 · 1225 阅读 · 0 评论 -
杭电ACM2041楼梯问题
#includeusing namespace std;int main(){ int n,a; int m[45]={0,1,1}; cin>>n; while(n--) { for(int i=3;i<=40;i++) m[i]=m[i-1]+m[i-2]; cin>>a;原创 2013-03-26 19:33:46 · 1521 阅读 · 0 评论 -
动态规划C++::杭电ACM1003
#include using namespace std;int main(){ int T,N,i,j,a[100001],count=0; cin>>T; for (j=0;j<T;j++) { cin>>N; for (i=0;i<N;i++) cin>>a[i]; i原创 2013-04-05 17:06:46 · 1518 阅读 · 0 评论 -
杭电ACM----2018母牛的故事
#include using namespace std;int main(){ int n; int a[56]={0,1,2,3}; while(cin>>n&&n) { switch(n) { case 1: cout<<a[n]<<endl;原创 2013-04-07 16:37:26 · 2191 阅读 · 0 评论 -
杭电ACM2007平方和与立方和
#include using namespace std;int main(){ int m,n; int x=0,y=0; while (cin>>m>>n) { x=0,y=0; if(m>n) { m=m+n; n=m-n;原创 2013-04-07 16:59:22 · 3318 阅读 · 0 评论 -
卢卡斯队列
/* 黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子.... 黄金分割数是个无理数,也就是无法表示为两个整数的比值。0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得,我们取它的一个较精确的近似值:0.618034原创 2013-04-08 15:41:06 · 1516 阅读 · 2 评论 -
全国软件2. 三人年龄
三个神秘蒙面人来访F博士。博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁。我们3人年龄总和为70岁。且我们三人年龄的乘积是所有可能情况中最大的。请帮助F博士计算他们的年龄,从小到大排列,用逗号分开。参考答案:19,25,26我的答案是23 23 24#include using namespace std;int main(){ int x,y,z原创 2013-04-22 19:27:15 · 1763 阅读 · 0 评论