poj2082单调栈

和我的上一篇博客(poj2559单调栈)基本做法一致,就不多说了

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

struct sets{
    int high,wide;
}data;

int main()
{
    int n;
    while(scanf("%d",&n),n!=-1)
    {
        stack<sets>A;
        int totalwide=0,tempans=0;
        scanf("%d%d",&data.wide,&data.high);
        A.push(data);
        int ans=data.high*data.wide;
        
        for(int i=1;i<n;i++){
            scanf("%d%d",&data.wide,&data.high);
            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("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值