Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
180590 | C班-朱永裕 | 收集雨水 | C++ | 通过 | 100 | 3 MS | 296 KB | 889 | 2024-08-21 16:22:42 |
//收集雨水 #include <bits/stdc++.h> using namespace std; int height[10005],n; stack<int> st; //st设为单调栈 int main() { scanf("%d",&n); for(int i=0; i<n; i++) cin>>height[i]; long long ans=0; for (int i=0; i<n; i++) { while (!st.empty() && height[st.top()]<height[i])//维护单调递减栈 { int low=st.top(); //弹出栈的是低洼处 st.pop(); if (st.empty()) break; long long dist=i-st.top()-1; //计算出左右边界距离 int h=min(height[st.top()],height[i]); //左右边界最小值为水的高度 ans+=dist*(h-height[low]); //height[low]为雨水的最低处 } st.push(i); //存的不是高度,而是柱子的坐标 } printf("%lld\n",ans); return 0; }