栈应用问题

问题描述:

贴海报:小明接到老板的一个任务,老板要他在一块由高低不一的木板拼接而成的墙上贴海报。 海报是由矩形构成的。看着这高低不一的墙,小明想了一个问题:在这一面墙上能贴的海报 的最大面积究竟是多大呢?其中每一块木板的宽均为 1,且每块木板高度各不相同。现在,你的任务就是帮他完成他的疑问,求出在这面墙上可以贴的海报的最大面积。图 2 阴影部分就是最大面积的海报。  

★数据输入 

输入数据的第一行是一个整数 N(1≤N≤100,000),表示墙由 N 个木板组成。紧接着 N 个 整数 h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示按从左到右顺序给出的木板的高度。矩形的宽度为 1。  

★数据输出 

输出一个整数 S,表示以 X 轴为底边的最大矩形的面积。 

#include<iostream>
#include<cstdio>
#define MAX 100005
using namespace std;
struct Elem {
    int high;//矩形高度
    int wide;//矩形宽度
}stack[MAX];
int main() {
    int i, n, tmp, top;
    _int64 ans, s, w;//ans:当前最大面积,s为当前出栈元素得高度为最小值时得最大面积,w:需要加得宽度
    while (scanf_s("%d", &n) != EOF) {
        ans = 0;
        top = 0;//当前栈为空
        for (int i = 0; i < n; i++) {
            scanf_s("%d",&tmp);
            w = 0;
            while (top > 0 && stack[top - 1].high >= tmp) {//若栈非空且当前元素得高度小于等于栈顶元素
                s = stack[top - 1].high*(stack[top - 1].wide + w);//出栈并更新最大面积
                if (s > ans) {
                    ans = s;
                }
                w += stack[top - 1].wide;//更新需要为新栈顶元素叠加得宽度
                top--;
            }
            stack[top].high = tmp;
            stack[top].wide = 1 + w;//在本身宽度得基础上需要叠加得宽度
            top++;
        }
        w = 0;
        while (top > 0) {
            s = stack[top - 1].high*(stack[top-1].wide+w);
            if (s > ans) {
                ans = s;
            }
            w += stack[top - 1].wide;
            top--;
        }
        printf("%I64d
",ans);
    }
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/drq1/p/9507258.html