最大矩形面积

【题目描述】:

地面上从左到右并排紧挨着摆放多个矩形,已知这此矩形的底边宽度都为1,高度不完全相等。求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。

如 n = 7, 序列为2 1 4 5 1 3 3

          _                       _           
       _ | |                   _ | |          
      | || |    _  _          |H||H|    _  _  
 _    | || |   | || |    _    |H||H|   | || | 
| | _ | || | _ | || |   | | _ |H||H| _ | || | 
|_||_||_||_||_||_||_|   |_||_||H||H||_||_||_| 

最大面积:8

【输入描述】:

输入有多组数据,每组数据一行:

第一个数N,表示矩形个数

后面跟N个正整数,第i个正整数hi表示第i个矩形的高度。

最后一行,以一个单独的0结束。

【输出描述】:

每组输入数据一行,一个数表示最大矩形面积。

【样例输入】:

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

【样例输出】:

8
4000

【时间限制、数据范围及描述】:

时间:1s 空间:64M

30 %: 1<=N<=100

60 %: 1<=N<=1,000

100%: 1<=N<=500,000,0<=hi<=1,000,000,000

中文

【解题思路】

一个单调栈的基本题目,利用栈的思想即可解决

【code】

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 int n;
 6 long long ans,top;
 7 long long stack[500005],p[500005],s[500005];
 8 inline long long Max(long long a,long long b){
 9     return a>b?a:b;
10 }
11 int main(){
12     while(scanf("%d",&n)){
13         if(n==0)break;
14         ans=0;
15         memset(p,0,sizeof(p));
16         memset(s,0,sizeof(s));
17         memset(stack,0,sizeof(stack));
18         for(register int i=1;i<=n;i++){
19             long long h;
20             scanf("%lld",&h);
21             while(top>0&&p[top]>=h){
22                 ans=Max(ans,p[top]*(i-s[top-1]-1));
23                 top--;
24             }
25             p[++top]=h;
26             s[top]=i;
27         }
28         while(top>0){
29             ans=Max(p[top]*(n-s[top-1]),ans);
30             top--;
31         }
32         printf("%lld\n",ans);
33     }
34     return 0;
35 }

 

posted @ 2019-07-16 07:23  GTR_PaulFrank  阅读(992)  评论(0编辑  收藏  举报