1. 程式人生 > >zzuli:小G的日常之接雨水

zzuli:小G的日常之接雨水

http://acm.zzuli.edu.cn/problem.php?id=2400

題目描述

下雨了,小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)

 

輸出

可以接多少雨水。

 

樣例輸入

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

 

樣例輸出

6

先找出最高的一個柱子。

左邊按從左到右,如果該柱子低於前面最高的柱子,可以存下前面最高柱子高度減該柱子體積的水,如果該柱子前面沒有比它高的,就從這個柱子開始再往後。

最高柱子的右邊按從右到左進行上面的步驟。

#include<stdio.h>
#define N 1000020
int a[N];
int main()
{
    int i,n,max=-1,maxi=-1,x;
    long long sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]>max)
        {
            max=a[i];
            maxi=i;
        }
    }
    x=a[1];
    for(i=2;i<maxi;i++)
    {
        if(x>a[i])
            sum+=x-a[i];
        else
            x=a[i];
    }
    x=a[n];
    for(i=n-1;i>maxi;i--)
    {
        if(x>a[i])
            sum+=x-a[i];
        else
            x=a[i];
    }
    printf("%lld\n",sum);
    return 0;
}