在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个
矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。
例如下图,图1包含的矩形的高分别为2,1,4,5,1,3,3 单位长度,矩形的宽为1单位长度。
你的任务就是计算柱状图中以X轴为底边的最大矩形的面积。图2阴影部分就是上述例子的最大矩形面积。
输入格式
输入数据的第一行是一个整数 N(1≤ N ≤100000),表示柱状图包含 N 个矩形。
紧接着 N 个整数h1,…,hn(0≤ hi ≤20000, 1≤ i≤ N),表示柱状图中按从左到右顺序给出的矩形
的高度。矩形的宽度为1。
输出格式
输出一个整数S,表示以X轴为底边的最大矩形的面积。
输入样例
7
2 1 4 5 1 3 3
输出样例
8
思路分析:
对每个矩形进行循环,然后计算每个矩形他的隔壁最高能组成的面积是多少,然后输出就可以了。
源代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int MAX = 1;
struct MyStruct
{
int loc;
int height;
};
void Select(vector<MyStruct> array, int flag) {
int width = 1;
// 对左边进行探索
for (int i = flag - 1; i >= 0; i--) {
if (array[i].height >= array[flag].height) {
width++;
}
else
break;
}
// 对右边进行探索
for (int i = flag + 1; i < array.size(); i++) {
if (array[i].height >= array[flag].height) {
width++;
}
else
break;
}
// 每次对每个矩形的左右边探索后进行计算得出是否是最大
if (array[flag].height * width > MAX) {
MAX = array[flag].height * width;
}
}
int main() {
int number;
cin >> number; //输入矩形个数
//建立动态数组
vector<MyStruct> array(number);
int temp;
for (int i = 0; i < number; i++) {
cin >> temp;
array[i].loc = i;
array[i].height = temp;
}
for (int i = 0; i < number; i++) {
Select(array, i);
}
cout << MAX;
return 0;
}