笨蛋难题四
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价,为了防止别人发现他的秘密。他决定对于这家公司的 股票最多买一次,现在笨蛋已经将股票价格列了出来。(这已经不是笨蛋的难题了,他已经解决 呵 呵)。只想难为难为你呀,从股票价格表上,你能算出笨蛋的每股股票最多能赚多少钱吗?
- 输入
- 第一行一个n,表示n天(小于100000)
第二行 给出n天每股的价格 - 输出
- 每股最多赚多少钱
- 样例输入
-
4 947 267 359 771 7 669 735 322 794 397 565 181
- 样例输出
-
504 472
错误思路:把一串数据弄成n段递增子串处理,仅仅考虑递增子串中的极差,如1,6,7,2,11,把其分为1,6,7和2,11两段,结果算出极差为9,正确应是10
正确思路:仍是考虑递增,但要多记录一个最小值,数据变大时,不作改变,数据变小时,计算前一位与最小值的极差,同时如果变小后的数据比最小值还要小,更新之
错误代码:
#include<iostream> #include<stdio.h> using namespace std; #define INF 0x3f3f3f3f int main() { int n,i,j; long long x,y,sum,max; while(scanf("%d",&n)!=EOF) { sum = 0; max = 0; for(i=0;i<n;i++) { if(i==0) scanf("%lld",&x); else { scanf("%lld",&y); if(y>=x) sum += y-x; else { if(sum>max) max=sum; sum = 0; } x = y; } } if(sum!=0) if(sum>max) max=sum; printf("%lld\n",max); } return 0; }
正确代码
#include<iostream> #include<stdio.h> using namespace std; #define INF 0x3f3f3f3f int x[100001]; int main() { int n,max,min,h=0,i,j; while(scanf("%d",&n)!=EOF) { max = 0; for(i=0;i<n;i++) { scanf("%d",&x[i]); if(i==0) min=x[i]; if(x[i]<x[i-1]) { if(x[i-1] - min >max) max = x[i-1] -min; //以目前最大的数减去 其之前最小的数 if(x[i]<min) min=x[i]; } } if(x[n-1] - min>max) max = x[n-1] - min; printf("%d\n",max); } return 0; }