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

GEEK编程练习— —雨水存储问题

时间:2016-05-27 11:35:21      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

题目

给定n个非负整数,分别代表围栏的高度,计算给定的这组数字代表的围栏能够容纳多少水,如图所示。

技术分享

输入

0 1 0 2 1 0 1 3 2 1 2 1 

输出

6

分析

对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积是min(max_left, max_right) - height。所以可以先扫描一遍,找到最高的柱子,将数组分为两半,然后分别进行处理。

代码

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> bars = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};

    int height = 0;

    //寻找最高的柱子
    for (int i = 0; i < bars.size(); i++)
        if (bars[i] > bars[height])
            height = i;

    int water = 0;

    //左边储水量
    for (int i = 0, peak = 0; i < height; i++)
        if (bars[i] > peak)
            peak = bars[i];
        else
            water += peak - bars[i];

    //右边储水量
    for (int i = bars.size() - 1, top = 0; i > height; i--)
        if (bars[i] > top)
            top = bars[i];
        else
            water += top - bars[i];

    cout << water << endl;

    return 0;
}

GEEK编程练习— —雨水存储问题

标签:

原文地址:http://blog.csdn.net/sin_geek/article/details/51507695

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