描述
以下图片描述了一系列不同高度的墙(如图中有9个墙,高度分别为[2, 5, 1, 2, 3, 4, 7, 7, 6]),假如开始下雨了,那么墙之间的水坑能够装多少水呢?为了简化问题,只需要求积水的横截面积。
输入
输入数据有多组,第一行为数据组数T(1<=T<=25)。
每组数据包含2行,第一行为正整数n(1<=n<=1000, 000),表示墙的数量。第二行为n个正整数,表示从左到右每堵墙的高度。
输出
每组输出一个整数,即积水量(面积)。
样例输入
1
9
2 5 1 2 3 4 7 7 6
样例输出
10
题目来源
http://210.32.82.1/acmhome/problemdetail.do?&method=showdetail&id=4664
我们可以从左右两边往里面计算积的水 , 确保积的水不能漏, 从左往右要低于左边最高点 , 从右往左要低于右边的最高点 , 如果发现更高点, 那么最高点更新 。
#include <iostream> using namespace std; #include <algorithm> #include <cstring> int a[1000005]; int main() { int n,m,test,i,j,k,max1,s,g,max2; cin>>test; while(test--){ cin>>m; s=0; for(i=1;i<=m;i++) scanf("%d",&a[i]); max1=a[1]; //左边最高点 max2=a[m]; //右边最高点 i=1; j=m; while(i<j) //i=j的时候所有的点都找过了 { if(max1<max2) //左边小往右边找, 看看有没有更高的 { i++; if(a[i]>max1) //最高点更改 max1=a[i]; else s=s+max1-a[i]; //只有比前面低才能积水, 从而确保水不会漏出去 } else //右边也是同理 { j--; if(a[j]>max2) max2=a[j]; else s=s+max2-a[j]; } } cout<<s<<endl; } }