5.北湖深坑

题目

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;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值