poj2559单调栈

题意:在多个矩形中,已知这些矩形的宽度都为1,长度不完全相等,求在这些矩形按题给顺序排列能包括的范围内能得到的面积最大的矩形


单调栈类型题目,所有元素各进栈和出栈各一次

先按照从小到大排序,一旦有不满足的就把前面的元素踢出去,并且计算之前一个的最大面积,然后组合成一个新的,但是这个新的的宽是把之前的累加在一起的

如果满足从小到大,就直接存在栈里面


最后都把这些元素提出来,计算相应的面积,并且选出最大的面积输出就好了

#include<stdio.h>
#include<stack>
using namespace std;

struct sets{
    __int64 high,wide;
}data;

int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        stack<sets>A;
        __int64 totalwide,tempans;
        scanf("%I64d",&data.high);
        data.wide=1;
        A.push(data);
        __int64 ans=data.high*data.wide;

        for(int i=1;i<n;i++){
            scanf("%I64d",&data.high);
            data.wide=1;
            if(data.high>=A.top().high){
                A.push(data);
            }
            else{
                totalwide=tempans=0;
                while(!A.empty()&&A.top().high>data.high){
                    totalwide+=A.top().wide;
                    tempans=totalwide*A.top().high;
                    if(tempans>ans)
                        ans=tempans;
                    A.pop();
                }
                totalwide+=data.wide;
                data.wide=totalwide;
                A.push(data);
            }
        }

        totalwide=tempans=0;
        while(!A.empty()){
            totalwide+=A.top().wide;
            tempans=totalwide*A.top().high;
            A.pop();
            if(tempans>ans)
                ans=tempans;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值