时间限制:1000MS内存限制:256000KB 标准输入输出方式
题目描述
泽泽用了100000000000000000000 %10天的时间爬出了长城。长城的另一端是一条隧道,泽泽走了进去……泽泽不小心又到了英国。英国多雨,基本上隔2天就要下一场雨。泽泽人品不好,到这里的时候天正在下酸雨。酸雨会腐蚀建筑物,让那些建筑物显得很难看。英国有家工厂免费为一条街道的建筑物的墙面涂油漆。心肠虽好,但是由于技术问题,他们只能涂出一个矩形。现在由于酸雨事态严重,街道办主任下命令涂出面积最大的矩形。
街道上的建筑物高度参差不齐,那该怎么办呢?他们想到了泽泽。泽泽接到了这个任务,就去测量了这个街道上的所有建筑物的高度。
请根据泽泽的数据,计算出最大面积。
如下图所示,灰色部分为最大的矩形面积52。
输入
第1行1个整数n。表示有几幢楼。之后的一行有n个整数,表示第几幢楼的高度,最高的楼的高度为m。
输出
一个整数,制作防护板的最大面积。
输入样例复制
20 5 3 7 4 8 9 2 4 5 5 5 4 4 4 8 7 4 4 5 10
输出样例复制
52
说明
对于30%的数据,n<=100,m<=20
对于100%的数据,n<=100000,m<=50
这道题的题意很简单,就是求最大长方形的面积
一看到这道题很多人的第一反应绝(ying)对(gai)是
二维前缀和
其实枚举就能做出来
目的就是枚举最大的长方形
那问题来了,如何枚举呢?
学过小学数学的人都知道,一个大长方形内,小长方形的个数是
[a(a+1)/2]*[b(b+1)/2]-------长的线段个数乘宽的线段个数
但如果这么算的话
那就要算1000000*1000001*50*51/4次
绝对爆了
因此我们要逐行枚举
下面的s放的是每行的 连续最大数!!!
ans放最大长方形面积
以数组的形式输入
h放最高的高度
#include<bits/stdc++.h>
using namespace std;
int a[100010],h,n,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
h=max(h,a[i]);
}
for(int i=1;i<=h;i++)//只用枚举到最高的高度
{
int s=0;
for(int j=1;j<=n;j++)//逐行枚举
{
if(a[j]>=i)//大于当前高度s++
s++;
else//否则间断重计
s=0;
ans=max(i*s,ans);
}
}
cout<<ans;
return 0;
}
(来都来了,看都看了,点个赞呗 ) (づ。◕‿‿◕。)づ)
30分代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b[100090],c=0,r=0;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b[i];
if(b[i]<=b[i-1])
{
c=b[i];
}
}
for(int i=1;i<=a;i++)
{
if(b[i]>=c)
{
r++;
}
else r=0;
}
cout<<r*c;
return 0;
}
100分代码
#include<bits/stdc++.h>
using namespace std;
int a[100010],h,n,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
h=max(h,a[i]);
}
for(int i=1;i<=h;i++)
{
int s=0;
for(int j=1;j<=n;j++)
{
if(a[j]>=i)
s++;
else
s=0;
ans=max(i*s,ans);
}
}
cout<<ans;
return 0;
}