标签:
这个题就是给你一串连续的矩形, 每个矩形的宽度为1, 高度给定, 选定连续的一串矩形, 其高度是所有矩形高度中的最小值,宽度为选定的, 问怎么选能使矩形的面积最大?我们以一个矩形为中心,并设这个矩形的高度最小, 分别向两边延生, 那么此时的最大面积就是a[i] * (R[i]-l[i]+1), 代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; int n; int a[100000+100]; int st[100000+100], top; int L[100000+100], R[100000+100]; int main(){ while(scanf("%d", &n) == 1){ if(n == 0) break; for(int i=0; i<n; i++) scanf("%d", &a[i]); top = 0; //计算最左边的 for(int i=0; i<n; i++){ while(top>0 && a[st[top-1]]>=a[i]) top--; L[i] = top==0?0:st[top-1]+1; st[top++] = i; } //计算最右边的 top = 0; for(int i=n-1; i>=0; i--){ while(top>0 && a[st[top-1]]>=a[i]) top--; R[i] = top==0?n-1:st[top-1]-1; st[top++] = i; } // for(int i=0; i<n; i++) // printf("%d%c", L[i], i==n-1?‘\n‘:‘ ‘); // for(int i=0; i<n; i++) // printf("%d%c", R[i], i==n-1?‘\n‘:‘ ‘); LL area = 0; for(int i=0; i<n; i++){ area = max(area, (LL)a[i]*(R[i]-L[i]+1)); } cout<<area<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/xingxing1024/p/5284038.html