题意:坐标轴上有连续的n个底均为1,高为h[i]的矩形,求能够构成的最大矩形的面积。
学习的别人的代码 @[email protected]
看底的坐标怎么找的看了好一会儿---
记l[i]为矩形的底的左边的坐标,就将它一直向左扩展
记r[i]为矩形的底的右边的坐标(倒着找,从n开始找,题解里面还着重强调了要倒着找,要不然就体现不出优化了)至于那个优化,我想的是,每一次算r[i]的时候,它前面的一个r[i]就是覆盖得最远的了,可以减少计算(用了一组样例试验)
然后就枚举找出面积的最大值--
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int l[100005],r[100005],h[100005]; int main() { int n,i; while(scanf("%d",&n)!=EOF&&n) { for(i=1;i<=n;i++) { scanf("%d",&h[i]); l[i]=r[i]=i; } for(i=1;i<=n;i++) while(l[i]>1&&h[l[i]-1]>=h[i]) l[i]=l[l[i]-1]; for(i=n;i>=1;i--) while(r[i]<n&&h[r[i]+1]>=h[i]) r[i]=r[r[i]+1]; __int64 ans=-10000; __int64 tmp; for(i=1;i<=n;i++) { tmp=(__int64)(r[i]-l[i]+1)*h[i]; if(tmp>ans) ans=tmp; } printf("%I64d\n",ans); } }
时间: 2024-10-05 04:33:30