问题描述
输入
输出
测试数据
输入
2
12
0 1 0 2 1 0 1 3 2 1 2 1
5
5 2 3 2 4
输出
6
5
代码
先挖坑再填坑,下次动手之前倒是先想清楚了啊大哥。。。
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
long int h,w;
long int aim[100002],a1[100002],a2[100002];
long int sum = 0,max = 0;
scanf("%ld",&w);
for(long int i = 1; i <= w; i ++)
{
scanf("%ld",&aim[i]);
}
// 这里,我们采取分别从左到右和从右到左的方式来遍历,
// 求出
// 1: 到当前地面为止,这块对面左边的最大高度
// 2:到当前地面为止,这块地面右边的最大高度
for(long int i = 1; i <= w; i ++)
{
max = (max > aim[i]) ? max : aim[i];
a1[i] = max;
} //找左边
max = 0;
for(long int i = w; i >= 1; i --)
{
max = (max > aim[i]) ? max : aim[i];
a2[i] = max;
} //找右边
for(long int i = 1; i <= w; i ++)
{
if(a1[i] > a2[i])
{
a1[i] = a2[i];
}
} //接下来,我们找到这两个最大值中的小的那个值
for(long int i = 1; i <= w; i ++)
{
sum = sum + (a1[i] - aim[i]);
}
//这样,这个最小值就是我们可以注水的最大高度
printf("%ld\n",sum);
}
return 0;
}