題目描述
春春幼兒園舉辦了一年一度的「積木大賽」。今年比賽的內容是搭建一座寬度爲n的大廈,大廈能夠當作由n塊寬度爲1的積木組成,第i塊積木的最終高度須要是hi。ios
在搭建開始以前,沒有任何積木(能夠當作n塊高度爲 0 的積木)。接下來每次操做,小朋友們能夠選擇一段連續區間[l, r],而後將第第 L 塊到第 R 塊之間(含第 L 塊和第 R 塊)全部積木的高度分別增長1。ide
小 M 是個聰明的小朋友,她很快想出了建造大廈的最佳策略,使得建造所需的操做次數最少。但她不是一個勤於動手的孩子,因此想請你幫忙實現這個策略,並求出最少的操做次數。
輸入輸出格式spa
輸入格式:
輸入文件爲 block.in.net
輸入包含兩行,第一行包含一個整數n,表示大廈的寬度。3d
第二行包含n個整數,第i個整數爲hi 。
輸出格式:code
輸出文件爲 block.outblog
僅一行,即建造所需的最少操做數。get
輸入輸出樣例
輸入樣例#1:it
5
2 3 4 1 2io
輸出樣例#1:
5
說明
【樣例解釋】
其中一種可行的最佳方案,依次選擇
[1,5] [1,3] [2,3] [3,3] [5,5]
【數據範圍】
對於 30%的數據,有1 ≤ n ≤ 10;
對於 70%的數據,有1 ≤ n ≤ 1000;
對於 100%的數據,有1 ≤ n ≤ 100000,0 ≤ hi≤ 10000。
思路
這個題我也不懂如何描述思路了,看看人家怎麼描述吧(說實話,我看完之後仍是以爲抽象/玄學,你們不妨直接看代碼吧)
https://blog.csdn.net/qq_35772697/article/details/52717046
https://blog.csdn.net/hyj542682306/article/details/70568728
https://blog.csdn.net/beautiful_CXW/article/details/80984568
就是說,每個遞增區塊,都有一個最高值和一個最低值
納悶呢咱們設置一個x,就是當前區塊的最低值,日後掃,比它大那麼久加上他們的差,並把x這個值賦值爲當前這個值,再日後掃知道遇到第一個右邊比左邊低的,把x換成這個最低值。
後面的最低值若是沒必要所有的最低值,這裏的操做就不用加上,只要加上其餘區間就好了。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 int n,ans,maxx=0; 7 8 int main() 9 { 10 scanf("%d",&n); 11 for (int i=1; i<=n; i++) 12 { 13 int x; 14 scanf("%d",&x); 15 if (x>maxx) { ans+=x-maxx; maxx=x;} 16 else maxx=x; 17 } 18 printf("%d",ans); 19 }
1 #include <stdio.h> 2 int main() 3 { 4 int n,i,x,pre=0,ans=0; 5 scanf("%d",&n); 6 for(i=1;i<=n;i++) 7 { 8 scanf("%d",&x); 9 if(x>=pre) ans=ans+x-pre; 10 pre=x; 11 } 12 printf("%d\n",ans); 13 return 0; 14 }