• 广告印刷


    【题目描述】
    广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。
    小明决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,
    从左到右给出每个建筑物的高度H1、H2······HN,且0 < Hi <= 1000000000,并且我们假设每个建筑物的宽度均为1。

    要求输出广告牌的最大面积。

    【输入文件】
    第一行是一个数n (n <= 400000);
    第二行是n个数,分别表示每个建筑物高度H1、H2······HN,且0 < Hi <= 1000000000。
    【输出文件】
    一行,表示广告牌的最大面积。
    【输入样例】
    6
    5 8 4 4 8 4
    【输出样例】

    24

    源代码:
    
    #include<cstdio>
    int n,h[400001],Q[400001];
    long long Left[400001],Right[400001];
    void Read(int &t)
    {
        char T=getchar();
        while (T<'0'||T>'9')
          T=getchar();
        while (T>='0'&&T<='9')
        {
            t=t*10+T-'0';
            T=getchar();
        }
    }
    void X_Left()
    {
        Q[0]=0;
        int front=0,tail=1;
        for (int a=1;a<=n;a++)
        {
            while (front<tail&&h[a]<=h[Q[tail-1]])
              tail--;
            Left[a]=a-Q[tail-1]-1;
            Q[tail++]=a;
        }
    }
    void X_Right()
    {
        Q[0]=n+1;
        int front=0,tail=1;
        for (int a=n;a>=1;a--)
        {
            while (front<tail&&h[a]<=h[Q[tail-1]])
              tail--;
            Right[a]=Q[tail-1]-a-1;
            Q[tail++]=a;
        }
    }
    long long Max_Area()
    {
        long long Max=-1;
        for (int a=1;a<=n;a++)
        {
            long long Area=(Left[a]+Right[a]+1)*h[a];
            if (Area>Max)
              Max=Area;
        }
        return Max;
    }
    int main()
    {
        Read(n);
        for (int a=1;a<=n;a++)
          Read(h[a]);
        h[0]=h[n+1]=-1;
        X_Left();
        X_Right();
        printf("%lld",Max_Area());
        return 0;
    }
  • 相关阅读:
    Zookeeper服务器启动
    BeanFactoryPostProcessor
    ZK简介
    自定义标签解析
    高性能MySQL
    Redis原理
    ApplicationContext
    ThreadPoolExecutor
    NW.js构建PC收银端安装程序的指南
    NW.js安装原生node模块node-printer控制打印机
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5737846.html
Copyright © 2020-2023  润新知