//目录

计算最大矩形面积,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

 

posted @ 2016-05-11 21:07  小草的大树梦  阅读(484)  评论(0编辑  收藏  举报