笨蛋難題
阿新 • • 發佈:2017-12-13
main i++ 子串 公司 clas mit memory inf 描述
笨蛋難題四
時間限制: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; }
笨蛋難題