1. 程式人生 > >洛谷P1969 積木大賽 數學

洛谷P1969 積木大賽 數學

區間 積木 ret 另一個 urn scanf ast str esp

洛谷P1969 積木大賽
題意: 對於n個積木 排成了一排 高度不同
每次可以使 L--R的區間積木減一,但不能使積木高度減至 0 以下 ,
求幾次能夠使得所有積木高度降為 0

數學
1、對於一段 上升、不下降序列,其較低的一定會在解決最高時候就解決掉
2、而這段區間還同時會解決掉下一段區間最小值 以下的那些積木
3、所以這段區間消耗值就是這段上升(不下降)序列的最大值減最小值

先寫思路:
對於一段上升(不下降)區間,我們在搭最高層時可以把下面一起搭了
而如果這個區間開始下降,那麽我們進入另一個區間,這個上升區間中
的最小值以下部分都可以在上個區間搭完,所以他的消耗就是本區間最大減最小(第一段減0)
復雜度O(n) 啦啦啦

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std ; 
 4 
 5 int n,ans,last ; 
 6 int h[100001] ; 
 7 
 8 int main() 
 9 {
10     scanf("%d",&n) ; 
11     for(int i=1;i<=n;i++) 
12         scanf("%d",&h[ i ]) ; 
13     last = 0 ; 
14     for(int i=1;i<=n;i++) 
15 if( h[ i ] > h[ i+1 ]) 16 ans+=( h[ i ]-last ),last = h[ i+1 ] ; 17 printf("%d\n",ans) ; 18 return 0 ; 19 }

洛谷P1969 積木大賽 數學