洛谷P1969 積木大賽 數學
阿新 • • 發佈:2017-06-05
區間 積木 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 積木大賽 數學