zzuli:小G的日常之接雨水
阿新 • • 發佈:2018-11-26
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; }