zoukankan      html  css  js  c++  java
  • 广告印刷

    【题目描述】
    广告牌是刷在城市的建筑物上的,城市里有紧靠着的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;
    }
  • 相关阅读:
    复制datatable的指定行到另外一个datatable
    .NET Framework 版本
    Excel读取
    asp.net技巧
    添加的控件的追赶事件
    MasterPage和内容页之间数据传递
    常用JS方法
    在服务器端修改HTML控件的属性
    IsPostBack深入探讨
    js(javascript)自定义的DateAdd和DateDiff函数以及当前日期的取法
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5737846.html
Copyright © 2011-2022 走看看