1. 程式人生 > >NOIP2013積木大賽 [貪心]

NOIP2013積木大賽 [貪心]

hide alt 最大值 出發 -c splay 多個 sin iostream

大意

自己查去...

說明

這道題正解是貪心,但標程裏是有這樣一句話的:把序列分成(a1,..ai)(ai+1,...aj)......(ak,...an)多個非遞減序列。然後所有段中最大值的和減去除第一段外的段的最小值

是否太詭異了呢

於是本oier決定來一個較詳細的解析,我們從樣例出發

技術分享圖片

我們會想到先把2層的建好

技術分享圖片而下一個是3層的,為了使得區間數最小,我們就把2層時建的區間延伸過去技術分享圖片

但三層不夠於是單鍵一層技術分享圖片

而後面的放置類似的技術分享圖片

觀察延伸的過程

當後一個比前一個大時,前一個的區間覆蓋不到後一個 答案必須要加上後一個比前一個多的。

當後一個比前一個少時,之前的區間一定可以延伸出去覆蓋到它,所以答案只加後一個比前一個大的數。

代碼在此

技術分享圖片
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,p,ans;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        int k=x-p;
        if(k>0)ans+=k;
        p=x;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

NOIP2013積木大賽 [貪心]