计算最大矩形面积,POJ(2082)

本文探讨了如何通过栈操作解决矩形按照高度递增排列的问题,并提供了算法实现细节。

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

把矩形按照高度一次递增的循序排列,当违反这一规则的时候,更新ans,用新的data替换之前的矩形。然后最后扫一遍。

 

#include <iostream>
#include <stack>
#include <cstdio>

using namespace std;

struct rec {
    int w;      ///
    int h;      ///
} data;

int main() {
    int n;
    while(scanf("%d",&n),n!=-1) {
        int ans=0;
        int totalw=0;   ///总宽
        int curarea=0;  ///当前面积
        stack<rec> s;   ///定义一个长方形的栈
        int lasth=0;    ///上一次进栈的矩形的高度
        for(int i=0; i<n; i++) {
            scanf("%d%d",&data.w,&data.h);
            if(data.h>=lasth) {
                s.push(data);       
            } else {
                ///更新ans
                totalw=0;
                curarea=0;
                while(!s.empty()&&s.top().h>data.h) {
                    totalw+=s.top().w;
                    curarea=totalw*s.top().h;
                    if(curarea>ans)
                        ans=curarea;
                    s.pop();    ///抛掉,最后用新的data代替
                }
                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();
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/TreeDream/p/5483542.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值