POJ2082 Terrible Sets-矩形面积 栈的应用


http://poj.org/problem?id=2082

题意:题目一串废话简单地说就是将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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值