# POJ 2082 堆栈

Terrible Sets
 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 2882 Accepted: 1479

Description

Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all real numbers. wi, hi for i = 1 . . . n are some elements in N, and w0 = 0.
Define set B = {< x, y > | x, y ∈ R and there exists an index i > 0 such that 0 <= y <= hi ,∑ 0<=j<=i-1wj <= x <= ∑ 0<=j<=iwj}
Again, define set S = {A| A = WH for some W , H ∈ R + and there exists x0, y0 in N such that the set T = { < x , y > | x, y ∈ R and x0 <= x <= x0 +W and y0 <= y <= y0 + H} is contained in set B}.
Your mission now. What is Max(S)?
Wow, it looks like a terrible problem. Problems that appear to be terrible are sometimes actually easy.
But for this one, believe me, it's difficult.

Input

The input consists of several test cases. For each case, n is given in a single line, and then followed by n lines, each containing wi and hi separated by a single space. The last line of the input is an single integer -1, indicating the end of input. You may assume that 1 <= n <= 50000 and w 1h 1+w 2h 2+...+w nh n < 10 9.

Output

Simply output Max(S) in a single line for each case.

Sample Input

3
1 2
3 4
1 2
3
3 4
1 2
3 4
-1

Sample Output

12
14
题目大意：
       给你诺干个沿着x轴排列的矩形 ，给长和宽， 要你求出这些矩形能组成最大矩形的面积
       不懂题意可以看 网址：http://www.cnblogs.com/hxsyl/archive/2012/08/16/2643015.html
       这个博客说的很详细；
解题方法：
      先调解矩形的高是递增的，为什么要递增 目的是这样才能方便找到最大面积 具体的含有DP 思想
      其次，计算最大面积即可；
      最后要说明的是主要利用堆栈进行处理  也是 为什么上面要递增 其次要主要的是ans lasth 放置的位置
源代码：
     #include<iostream>
#include<stack>
using namespace std;

struct ss{
int w, h;
}data;

stack<ss>s;

int main()
{
int n, i ,ans, curarea, lasth, totalw;
while(cin>>n , n!= -1)
{
ans = 0;
lasth = 0;
for(i = 0; i < n; i++)
{
cin>>data.w>>data.h;
if(data.h >= lasth)
{
s.push(data);
}
else
{
totalw = 0;
curarea = 0;
while(!s.empty() && data.h < s.top().h)
{
totalw += s.top().w;
curarea = totalw*s.top().h;
if(curarea > ans)
{//计算在出栈过程中出现的最大值
ans = curarea;
}
s.pop();
}
totalw += data.w;
data.w = totalw;
s.push(data);// 新的矩形入栈
}
lasth = data.h;
}
totalw = 0;
curarea = 0;
while(!s.empty())
{
totalw += s.top().w;
curarea =totalw*s.top().h;
if(curarea > ans)
{
ans = curarea;
}
s.pop();
}
cout<<ans<<endl;
}
return 0;
}

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis

03-24 588
07-31 357 10-30 257
08-03 255
11-09 338
02-25 25
11-27 494
03-08 378
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 点击重新获取   扫码支付 1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。 余额充值