zoukankan      html  css  js  c++  java
  • 栈应用问题

    问题描述:

    贴海报:小明接到老板的一个任务,老板要他在一块由高低不一的木板拼接而成的墙上贴海报。 海报是由矩形构成的。看着这高低不一的墙,小明想了一个问题:在这一面墙上能贴的海报 的最大面积究竟是多大呢?其中每一块木板的宽均为 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;
    }
  • 相关阅读:
    java面试题
    [gcc]: unknown (64bit) [FAIL]
    一种基于Spring的java程序常量管理思路
    if (! +"\v1")的解释
    jQuery validation plugin
    oscache缓存技术
    基于jQuery开发的javascript模板引擎jTemplates
    编写好的CSS代码的13个忠告
    对 HTTP 304 的理解
    Hibernate N+1 问题
  • 原文地址:https://www.cnblogs.com/drq1/p/9507258.html
Copyright © 2011-2022 走看看