题目:
给你一堆挤在一起的矩形(不可旋转)。问这些矩形能组成的面积最大矩形的面积是多少。
思路:
用单调栈, 使栈内矩形按照高度 H 严格递增。对于一个新的矩形q, 如果q.H < stack.top.H
就退回到可以压入的地方, 在退回时, 计算退去矩形的面积,取一次最大值。
Code:
//#include <bits/stdc++.h>
#include <iostream>
#include <stack>
using namespace std;
struct Node {
int w, h;
Node(int _w, int _h):\
w(_w),h(_h) {}
};
stack<Node> Tmp;
int main() {
int n;
int w, h;
while(cin >> n && n != -1) {
while(!Tmp.empty()) Tmp.pop();
int SumW = 0, SumS = 0;
int preH = 0, Ans = 0;
for(int i = 0; i < n; ++i) {
cin >> w >> h;
if(h >= preH) Tmp.push(Node(w, h));
else {
SumW = SumS = 0;
while(!Tmp.empty() && Tmp.top().h > h) {
SumW += Tmp.top().w;
SumS = SumW * Tmp.top().h;
Ans = max(Ans, SumS);
Tmp.pop();
}
Tmp.push(Node(SumW+w, h));
}
preH = h;
}
SumW = SumS = 0;
while(!Tmp.empty()) {
SumW += Tmp.top().w;
SumS = SumW * Tmp.top().h;
Ans = max(Ans, SumS);
Tmp.pop();
}
cout << Ans << endl;
}
}