当青训营遇上码上掘金
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
思路
对于本题,我们可以维护一个单调栈
当栈顶的元素下标小于栈顶元素的上一个元素的,那么就会形成一个凹槽,高度为两个元素最小值减去栈顶元素,长度为元素下标减去栈顶元素上一个元素的下标再减去一。 总的累积的绿豆就是所有这些凹槽累积之和
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int N=1e5+10;
stack<int> s;
int res;
int main(){
int n, x;
cin>>n;
vector<int> v;
for(int i=0;i<n;i++){
cin>>x;
v.push_back(x);
}
for(int i=0;i<n;i++){
while(!s.empty() && v[s.top()] < v[i]) {
int hh = v[s.top()];
s.pop();
if(s.empty()) break;
int h = min(v[s.top()],v[i])-hh;
int w = i-s.top() -1;
res += w*h;
}
s.push(i);
}
cout<<res<<endl;
}