题意:题目一串废话简单地说就是将n个宽度分别为wi,高度分别为hi的矩形下端对齐依次排列,求组成的图形中包含的最大的连续矩形的面积。
分析:栈的应用。ans记录当前最大面积即最后结果。矩形依次入栈同时保证高度递增(图1),其中用lasth记录栈顶矩形高度,若即将入栈的矩形高度小于lasth,则出栈直到栈顶矩形高度不大于此矩形(图2),出栈的过程中计算出栈矩形能形成的最大矩形面积(图3),其中totalw累加出栈矩形的宽度,curarea记录以当前出栈矩形高度为高totalw为宽的矩形的面积,若大于ans则更新ans。出栈结束后向栈中压入一个宽为totalw+rec.w高为rec.h的矩形(图4),继续读入。最后栈中只剩下高单调递增的矩形,向上一步那样将栈中元素依次出栈判断面积大小即可。
图1
图2
图3
图4
#include <cstdio>
#include <stack> //栈标准库
using namespace std;
struct rect{
int w;
int h;
}rec;
int main()
{
int num,ans,lasth,totalw,curarea; //ans:最终结果
stack<rect>s;
while (scanf("%d", &num), num != -1)
{
ans = 0; lasth = 0; //lasth:上一个进栈的矩形高
for (int i = 0; i != num; i++)
{
scanf("%d%d", &rec.w, &rec.h);
if (rec.h >= lasth)
{
s.push(rec);
}
else
{
totalw = curarea = 0;
while (!s.empty() && s.top().h > rec.h)
{
totalw += s.top().w;
curarea = totalw*s.top().h;
s.pop();
if (curarea > ans)
ans = curarea;
}
totalw += rec.w;
rec.w = totalw;
s.push(rec);
}
lasth =rec.h;
}
totalw = curarea = 0;
while (!s.empty())
{
totalw += s.top().w;
curarea = totalw*s.top().h;
if (curarea > ans)
ans = curarea;
s.pop();
}
printf("%d\n", ans);
}
return 0;
}