CCF考试——201312-3 最大的矩形

2020-04-20 14:15:14 浏览数 (2)

概要

问题描述

  在横轴上放了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


思路

分别利用vector和set存储据矩形高度,set的目的是防止重复数据的出现。利用迭代器it对set进行遍历,设置cnt为0,开始统计vector中高度大于it指向的高度的个数存储在cnt当中。若不连续则对阴影面积进行更新,cnt重新置0。


AC代码

代码语言:javascript复制
#include <iostream>
#include <vector>
#include <set> 
using namespace std;

vector<int> data;
set<int> s;
set<int>::iterator it;
int n,num;
long long ans;

int main()
{
    while(cin>>n){
        for(int i = 0 ; i < n ; i  ){
            cin>>num;
            data.push_back(num);
            s.insert(num);          //避免重复元素遍历 
        }
        ans = 0;
        for(it = s.begin() ; it != s.end() ; it  ){
            int cnt = 0;
            num = *it;
            for(int i  = 0 ; i < n ; i  ){
                if(data[i] >= num){         //连续大于data[i]的矩形个数 
                    cnt  ;
                }else{
                    if(ans < num*cnt){      //对最大面积进行更新 
                        ans = num*cnt;
                    }
                    cnt = 0;                //重新统计个数 
                }
            }
            if(ans < num*cnt){
                ans = num*cnt;
            }
        }
        cout<<ans<<endl;
    } 

    return 0;
} 

0 人点赞