NOIP2013積木大賽 [貪心]
阿新 • • 發佈:2018-02-13
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積木大賽 [貪心]