博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
广告印刷
阅读量:5169 次
发布时间:2019-06-13

本文共 1363 字,大约阅读时间需要 4 分钟。

【题目描述】

广告牌是刷在城市的建筑物上的,城市里有紧靠着的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
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
<=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
<=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;}

 

转载于:https://www.cnblogs.com/Ackermann/p/5737846.html

你可能感兴趣的文章