广告印刷

来源:互联网 发布:linux读取文件c语言 编辑:程序博客网 时间:2024/06/02 21:57
【题目描述】
广告牌是刷在城市的建筑物上的,城市里有紧靠着的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;}

 

0 0
原创粉丝点击