洛谷 P1969 積木大賽(NOIP2013)

題目描述
春春幼兒園舉辦了一年一度的「積木大賽」。今年比賽的內容是搭建一座寬度爲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 }
View Code

 

 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 }
相關文章
相關標籤/搜索