POJ 2082 堆栈

来源:互联网 发布:爱普生打印软件下载 编辑:程序博客网 时间:2024/06/06 01:59
Terrible Sets
Time Limit: 1000MS Memory Limit: 30000KTotal 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 w1h1+w2h2+...+wnhn < 109.

Output

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

Sample Input

31 23 41 233 41 23 4-1

Sample Output

1214
题目大意:
       给你诺干个沿着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;}

0 0
原创粉丝点击