在 x 轴上有相互挨着的矩形, 这些矩形有一个边紧贴着 x 轴,现在给出每个矩形的长宽, 所有的矩形看作整体当作一个画布, 则可以在这个画布上画出的最大的矩形的面积是多少。(画出的矩形长和高平行于X,Y轴),请使用C++编写实现过程,并附带注释
时间: 2024-03-06 07:50:13 浏览: 87
物联网netty服务端和客户端两个项目
好的,以下是C++代码实现过程,已加上注释:
```cpp
#include <bits/stdc++.h> // 引入万能头文件
using namespace std;
typedef long long ll; // 定义 long long 类型
const int N = 1e5 + 10; // 数组最大长度
ll n, a[N], st[N], top = 0, ans = 0; // n:矩形数量,a:每个矩形的长宽,st:单调栈,top:栈顶指针,ans:最大矩形面积
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i]; // 输入每个矩形的长宽
a[n + 1] = -1; // 将最后一个矩形的高度赋值为 -1,这样即可将所有矩形处理完毕
for (int i = 1; i <= n + 1; i++) { // 遍历每个矩形,包括最后一个高度为 -1 的矩形
int cnt = 1; // 当前矩形的宽度
while (top && a[i] < a[st[top]]) { // 单调栈处理,如果当前矩形高度比栈顶元素低,说明栈顶元素的最大矩形面积已经确定
cnt += st[top - 1] - st[top] + 1; // 计算栈顶元素的宽度
ans = max(ans, cnt * a[st[top]]); // 计算栈顶元素的最大矩形面积
top--; // 弹出栈顶元素
}
st[++top] = i; // 将当前矩形的下标加入单调栈
}
cout << ans << endl; // 输出最大矩形面积
return 0;
}
```
注:本算法使用单调栈(Monotone Stack)实现,时间复杂度为 O(n)。
阅读全文