CCF-CSP计算机软件能力认证 201312-3

最大的矩形

问题描述

             在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第 i ( 1 ≤ i ≤ n ) i(1 ≤ i ≤ n) i1in个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
C++ //CCF-CSP计算机软件能力认证 201312-3 最大的矩形-LMLPHP
             请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
C++ //CCF-CSP计算机软件能力认证 201312-3 最大的矩形-LMLPHP

输入格式

             第一行包含一个整数n,即矩形的数量 ( 1 ≤ n ≤ 1000 ) (1 ≤ n ≤ 1000) (1n1000)
             第二行包含n 个整数 h 1 , h 2 , … , h n h_1, h_2, … , h_n h1,h2,,hn,相邻的数之间由空格分隔。 ( 1 ≤ h i ≤ 10000 ) (1 ≤ h_i ≤ 10000) (1hi10000) h i h_i hi是第i个矩形的高度。

输出格式

             输出一行,包含一个整数,即给定直方图内的最大矩形的面积。

样例输入

       6
       3 1 6 5 2 3

样例输出

       10

环境:Linux Ubuntu(云服务器)
工具:vim
代码块:
方法:
/*************************************************************************
	> File Name: ex20131203.cpp
	> Author: 
	> Mail: 
	> Created Time: Tue 26 Mar 2024 10:54:45 AM CST
 ************************************************************************/

#include<iostream>
using namespace std;

int main(){
    int n;
    cin>>n;

    const int N = n;
    int h[N];
    for(int i = 0; i < n; ++i){
        cin>>h[i];
    }

    int base, tempArea, area = 0;
    int left, right;
    for(int i = 0; i < n; ++i){
        base = h[i];
        tempArea = base;
        left = i - 1;
        right = i + 1;
    
        while(left >= 0 && h[left] >= h[i]){
            tempArea += base;
            --left;
        }
        
        while(right < n && h[right] >= h[i]){
            tempArea += base;
            ++right;
        }
        
        if(tempArea > area){
            area = tempArea;
        }
    }

    cout<<area<<endl;

    return 0;
}
03-30 23:35