1. 程式人生 > >zzulioj2400 小G的日常之接雨水 預處理

zzulioj2400 小G的日常之接雨水 預處理

2400: 小G的日常之接雨水

時間限制: 1 Sec  記憶體限制: 128 MB
提交: 137  解決: 39
[提交] [狀態] [討論版] [命題人:541507070139]

題目描述

下雨了,小G想到了一個問題,給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
你能幫幫小G嗎? 
 
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 

輸入

第一行,輸入一個數n(1 <= n <= 1,000,000)
第二行,輸入n個數 (這n個數小於1e9) 

輸出

可以接多少雨水。 

樣例輸入 Copy

12
0 1 0 2 1 0 1 3 2 1 2 1

樣例輸出 Copy

6

思路:

我們預處理出每個柱子左右的最高柱子的長度,然後根據木桶理論用較短的那個減去當前的柱子的高度即是當前柱子的盛水量,當然,如果他的某一邊沒有比他更高的,那麼這個高度很明顯就是他自己

程式碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int a[maxn],b[maxn],c[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for (int i = 1;i <= n;i ++)
        scanf("%d",&a[i]);
    for (int i = 1;i <= n;i ++)
        b[i] = max(b[i - 1],a[i]);
    for (int i = n;i;i --)
        c[i] = max(c[i + 1],a[i]);
    long long ans = 0;
    for (int i = 1;i <= n;i ++)
        ans += min(b[i],c[i]) - a[i];
    printf("%lld\n",ans);
    return 0;
}