码迷,mamicode.com
首页 > 其他好文 > 详细

水沟积水

时间:2018-02-05 16:01:46      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:names   scan   nbsp   src   panel   color   acm   之间   ace   

描述

以下图片描述了一系列不同高度的墙(如图中有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;
    }
}

 

水沟积水

标签:names   scan   nbsp   src   panel   color   acm   之间   ace   

原文地址:https://www.cnblogs.com/ww123/p/8417698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!