POJ_2082Terrible Sets

题目链接:http://poj.org/problem?id=2082

/*

栈的运用:栈是一种先进后出的数据结构,通过一个栈顶指针对入栈和出栈控制,可以改变一个序列的顺序
本题就是运用栈将每个矩形(包括新形成的矩形)入栈,并且栈中矩形的高度成递增趋势,这样扫描整个栈就可以得出答案了
*/
#include <iostream>
#include <cstdio>
#include <stack>


using namespace std;


struct rect
{
    int w;
    int h;
}data;
int main()
{
    int n,ans,i,lasth,totalw,area;
    while(scanf("%d",&n)&&n!=-1)
    {
        ans=0;
        stack<rect>s; //定义一个空栈
        lasth=0;      //将初始高度设为0
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&data.w,&data.h);
            if(data.h>=lasth)//如果将要入栈的矩形高度大于等于上一个矩形的高度则入栈
            {
                s.push(data);
            }
            else
            {
                totalw=0;
                area=0;
                while(!s.empty()&&s.top().h>data.h)/*不能入栈的矩形与栈中矩形组成一个新的最大面积的矩形,
                                                     然后将新的矩形入栈,被组合的矩形要出栈
                                                     */
                {
                    totalw+=s.top().w;
                    area=totalw*s.top().h;
                    if(area>ans)
                    {
                        ans=area;
                    }
                    s.pop();
                }
                totalw+=data.w;
                data.w=totalw;
                s.push(data);
            }
            lasth=data.h;
        }
        totalw=0;
        area=0;
        while(!s.empty())//将整个栈扫描一遍 得出最大面积的矩形
        {
            totalw+=s.top().w;
            area=totalw*s.top().h;
            if(area>ans)
            ans=area;
            s.pop();
        }
        printf("%d\n",ans);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值