1120.泽泽在英国

文章讲述了如何解决求解一条街上,受到酸雨影响的建筑物墙面最大可涂漆矩形面积的问题。通过泽泽测量的建筑物高度数据,算法需要找出能覆盖的最大的矩形面积。文中提到了两种方法,一种是逐行枚举的高效方法,避免了二维前缀和可能导致的计算量过大问题,另一种是简单的记录连续最大数的方法。
摘要由CSDN通过智能技术生成

时间限制: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值