[积水的墙]防止生锈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 }
浙公网安备 33010602011771号