题目
Description
十年前,北湖还只是一个深坑,未完成蓄水工作。为了确保蓄水工作的顺利进行,我们需要对北湖的蓄水量进行粗略估计。
为了简化运算,我们假设北湖的地面是一维的,每一块宽度都为1,高度是非负整数,那么可以用一个数组来表达一块地面。
input
样例输入有多组。
第一行输入整数T,表示有T组用例;
接下来,对于每组用例,输入一个正整数n,,表示地面总宽度为n;
接下来一行是n个数ai,用空格隔开,表示地面高度。
Output
对于每个用例输出一行一个数字,表示蓄水总量。
思路
思路:与北湖挖坑相似,在考虑数组大小的同时,遍历数组,找到第i个元素左右两侧最高值中较低的那个,进而计算储水量
小坑:注意不要超时,使用暴力硬算大概率超时。也要注意最两端的数据。
代码
#include<stdio.h>
#include<string.h>
#include<math.h>
long long high[100010];
long long right[100010];
long long left[100010];
int main()
{
int t = 0; int n = 0;
long long water = 0;
scanf("%d",&t);
for(int i = 0; i < t; i++)//用例个数
{
water = 0;
scanf("%d",&n);//地面宽度
{
for(int j = 0; j < n; j++)//存进去
{
scanf("%lld",&high[j]);
}
right[n-1] = high[n-1];
left[0] = high[0];
for(int j = n-2; j >= 0; j--)//右侧最高
{
if(right[j+1] > high[j])
right[j] = right[j+1];
else
right[j] = high[j];
}
for(int j = 1; j < n; j++)//左侧最高
{
if(left[j-1] > high[j])
left[j] = left[j-1];
else
left[j] = high[j];
}
for(int j = 0; j < n; j++)
{
long long x = 0;
if(right[j] >= left[j]) x = left[j];
else if(right[j] < left[j]) x = right[j];
water += x-high[j];
}
printf("%lld\n",water);
}
}
return 0;
}