★问题描述:
在X轴上水平放置着N个条形图,这N个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。
例如,下图中,图1包含的矩形的高分别为2,1,4,5,1,3,3单位长度,矩形的宽为1单位长度。
你的任务就是计算柱状图中以X轴为底边的最大矩形的面积。图2阴影部分就是上述例子的最大矩形面积。
★数据输入:
输入数据的第一行是一个整数N(1≤N≤100,000),表示柱状图包含N个矩形。紧接着N个整数h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示柱状图中按从左到右顺序给出的矩形的高度。矩形的宽度为1。
★结果输出:
输出一个整数S,表示以X轴为底边的最大矩形的面积。
输入示例 输出示例
7 2 1 4 5 1 3 3 8
下面是我的代码,欢迎大家改进:
#include<iostream>
using namespace std;
#include<vector>
int main()
{
int n;//n个条形图
int i=0,j=0,k=0;//循环变量
int height;//定义每个矩形的高度
while(cin>>n)
{
vector<int> v_height,v_left,v_right,v_area;
v_height.push_back(0);//在第一个前面加上一个高度为0的矩形
for(i=1;i<=n;i++)
{
cin>>height;
v_height.push_back(height);//把高度存进去
}
v_height.push_back(0);//在最后一个后面加上一个高度为0的矩形
for(i=1;i<=n;i++)//对每个矩形进行遍历
{
//---求从左往右遍历找到所有柱形左边的第一个高度比它小的柱形,并将其X坐标值存入到v_left对应的元素中
for(j=i;j>=0;)
{
if(j==0)
{
v_left.push_back(0);
break;
}
if(v_height[j]>v_height[j-1])
{
int lpos=j-1;
v_left.push_back(lpos);
break;
}
else
j--;
}
//---求从左往右遍历找到所有柱形右边的第一个高度比它小的柱形,并将其X坐标值存入到v_right对应的元素中
for(j=i;j<=n;)
{
if(j==n)
{
v_right.push_back(n+1);
break;
}
if(v_height[j]>v_height[j+1])
{
int rpos=j+1;
v_right.push_back(rpos);
break;
}
else
j++;
}
}
//--计算面积并且存入v_area
for(k=1;k<=n;k++)
{
int area=v_height[k]*(v_right[k-1]-v_left[k-1]-1);
v_area.push_back(area);
}
int max=v_area[0];
for(k=1;k<n;k++)
{
if(max<v_area[k])
max=v_area[k];
}
cout<<max;
}//while()结束
}