问题描述
试题编号: 201312-3
试题名称: 最大的矩形
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述 在横轴上放了 n 个相邻的矩形,每个矩形的宽度是 1,而第 i(1 ≤ i ≤ n)个矩形的高度是 hi。这 n 个矩形构成了一个直方图。例 如,下图中六个矩形的高度就分别是 3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴 平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积
是 10。
输入格式 第一行包含一个整数 n,即矩形的数量(1 ≤ n ≤ 1000)。 第二行包含 n 个整数 h1, h2, … , hn,相邻的数之间由空格分 隔。(1 ≤ hi ≤ 10000)。hi是第 i 个矩形的高度。
输出格式 输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入 6 3 1 6 5 2 3
样例输出 10
/**解题思路:
本题我的解题思路是从最高的矩形i=highest开始,算出以该高度的最大矩形的面积
然后依次i=i-1,计算以新的i为高度的最大矩形面积
直到算出高度为1的最大矩形面积
然后比较得出整个直方图中最大的矩形面积
**/
//以下代码是本人根据自己的理解编写,因为无法拿到原始测试数据所以不能保证100%正确,有更好思路的大佬欢迎指正。\
#include<iostream>
#include<vector>
#include<string>
#include<bitset>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> all(n, 0);
int highest = 0;
for (int i = 0; i < n; i++)
{
cin >> all[i];
if (all[i] > highest)
highest = all[i];
}
long long maxSize = 0;
for (int i = highest; i >= 0; i--)
{
int tem[1000] = { 0 };//tem[x]表示第x个矩形是不是高于i(当前的上限值)
for (int j = 0; j < all.size(); j++)//循环找出所有高度大于当前i的矩形,并在tem数组中标记出来
{
if (all[j] >= i)
tem[j] = 1;
}
int maxContinuous = 0;//最长连续超过i的矩形的个数
int tempcon = 0;//临时存放每一块连续的矩形的个数
bool flag = false;
for (int j = 0; j < 1000; j++)//循环找出最长的连续的高于当前i的矩形个数
{
if (tem[j] == 1)
{
if (flag) //如果不是当前块第一个大于i的矩形
tempcon++;//当前连续个数+1
else
{
flag = true; //如果是当前块第一个大于i的矩形,设置标志位
tempcon++;
}
}
else//出现了一个小于i的矩形
{
flag = false; //设置标志位
if (tempcon > maxContinuous)//判断当前连续块的大小是不是最大
{
maxContinuous = tempcon;
}
tempcon = 0;
}
}
long long tempsize = maxContinuous*i;//计算以i为高度的最大矩形面积
if (tempsize > maxSize) //如果当前面积大于之前的最大面积
{
maxSize = tempsize;
}
}
cout << maxSize << endl;
}
\