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
",sum);
return 0;
}