CCF模拟题 最大的矩形
最大的矩形
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述
在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
输入格式
第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。 第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。 输出格式
输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6 3 1 6 5 2 3 样例输出
10
|
解题:哼哼哈哈 快使用单调栈
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 #define LL long long 3 using namespace std; 4 5 struct Node { 6 LL height,pos; 7 Node(LL x = 0,LL y = 0){ 8 height = x; 9 pos = y; 10 } 11 } Nodee; 12 13 stack<Node> stk; 14 int main() { 15 LL n,a,ans,idx; 16 while(~scanf("%I64d",&n)) { 17 while(!stk.empty()) stk.pop(); 18 stk.push(Node(0,0)); 19 for(LL i = ans = 0; i < n; i++) { 20 scanf("%I64d",&a); 21 idx = i; 22 while(a < stk.top().height) { 23 ans = max(ans,stk.top().height * (i - stk.top().pos)); 24 idx = stk.top().pos; 25 stk.pop(); 26 } 27 stk.push(Node(a,idx)); 28 } 29 while(!stk.empty()) { 30 ans = max(ans,stk.top().height * (n - stk.top().pos)); 31 stk.pop(); 32 } 33 printf("%I64d\n",ans); 34 } 35 return 0; 36 }
夜空中最亮的星,照亮我前行