挑战程序设计竞赛 算法和数据结构 第2章 算法与复杂度
2.5 入门问题
ALDS1_1_D: Maximum Profit
原书AC代码:
//ALDS1_1_D:Maximum Profit
//C++
#include <iostream>
#include <algorithm>
using namespace std;
static const int MAX=200000;
int main(){
int R[MAX],n;
cin>>n;
for(int i=0;i<n;i++)cin>>R[i];
int maxv=-2000000000;//设置一个足够小的初始值
int minv=R[0];
for(int i=1;i<n;i++){//此处写成for(int i=0;i<n;i++)//如果每次都在这一阶段直接读取R[i],那么数组可以省去
maxv=max(maxv,R[i]-minv);//更新最大值
minv=min(minv,R[i]);//暂存现阶段的最小值
}
cout<<maxv<<endl;
return 0;
}
未仿照上述代码,本人按自己思路编写的C语言AC代码如下:
//ALDS1_1_D:Maximum Profit
//先min后max,想了想min max有先后顺序,果断中止该想法
//想着开一个记录最大差值的数组, 但是n平方级别的算法复杂度,超时,不可避免,继续换思路
//继续想,每次记录min值,同时计算最大差值,一次扫描即可完成
//请注意,min应先出现,maxv应是当前出现。
//在抄写书中代码时,发现if(maxv<0)printf("-1\n"); else printf("%d\n",maxv);两句多余
//修改,提交AC 2017-10-17
#include <stdio.h>
int main(){
int min,maxv,n,ans,i,a;
scanf("%d",&n);
scanf("%d",&a);
min=a,maxv=-1999999999;
for(i=2;i<=n;i++){
scanf("%d",&a);
if(a-min>maxv)maxv=a-min;
if(a<min)min=a;
}
printf("%d\n",maxv);
return 0;
}
2017-10-17 AC 该章节内容