这是我第一次尝试第三题,这次的第三题不是很难,难度大概是比较难的第二题的难度。也许考试的时候我也做不出第三题,但是也算是一种尝试吧
一、题目
1.问题描述
在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
2.输入格式
第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
3.输出格式
输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
4.样例输入
6
3 1 6 5 2 3
5.样例输出
10
二、解题思路
这道题用的是暴力搜索的方法,我将每个矩形的面积都求出来,然后找最大值
关于求矩形面积,我们用长x宽来表示;长从1到输入最大值,宽是挨着的矩形个数(每个矩形宽为1,所以个数即为宽)
注意计算矩形数量是指高度达标并且挨着的矩形数量(如果中间断了需要重新计数)
大概意思说得。。。还行吧。。。。
如果大家还是不明白,就看看代码吧
老规矩,不会可以留言
三、代码程序
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
int b[a];
int i;
int maxi=0;
for(i=0;i<a;i++){
scanf("%d",&b[i]);
if(b[i]>maxi)
maxi=b[i];
}
int max=0,j;
int num=0;
for(i=1;i<=maxi;i++){
for(j=0;j<a;j++){
if(b[j]>=i){
num++;
}
else{
if(max<num*i)
max=num*i;
num=0;
}
}
if(j==a){
if(max<num*i)
max=num*i;
}
num=0;
}
printf("%d",max);
return 0;
}
四、运行结果
总结
先找到高度为1的矩形中面积最大的;然后找到所有高度为2的矩形…以此类推,直到找到高度为所输入最大值的矩形
此时,面积最大值为所求的面积