[积水的墙]防止生锈01

题目是从博客园新闻区浏览到的

http://news.cnblogs.com/n/192014/

印象中以前也解决过这种问题,题目姑且命名为”积水的墙“,截图来自上述链接

 

step 1:每两个较高点之间就能容纳一些水,较高点的定义为,两个点之间没有任何大于这两个点的数,同时外部也没有两个较高点包含了当前的较高点

step 2:我们控制两个指针,并判断从左开始墙的最大值maxL和从右开始墙的最大值maxR,

当maxL小于maxR,意味着右面一定有一面高墙保证水不会漏出去,

我们将左面指针向右移动,如果当前墙比maxL矮,那它一定会积水(左右都有较高点),如果比maxL高,我们更新maxL的值,继续扫描

右面亦然

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main()
 5 {
 6    int n,volume;
 7    cin>>n;
 8    vector<int> walls(n);
 9    for (int i=0; i<n; i++)
10        cin>>walls[i];
11 
12    int l=0,r=walls.size()-1;
13    int maxL=l,maxR=r;
14    volume=0;
15    while (l<r)
16    {
17       if (walls[maxL]<walls[maxR])
18       {
19           l++;
20           if (walls[l]>=walls[maxL])
21               maxL=l;
22           else
23               volume+=walls[maxL]-walls[l];
24       }
25       else
26       {
27           r--;
28           if (walls[r]>=walls[maxR])
29               maxR=r;
30           else
31               volume+=walls[maxR]-walls[r];
32       }
33 
34    }
35    cout<<volume<<endl;
36 
37     return 0;
38 }
View Code

 

 

 

posted on 2013-11-01 11:11  落缺L  阅读(113)  评论(0)    收藏  举报

导航