1. 程式人生 > >笨蛋難題

笨蛋難題

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;  
}

笨蛋難題