首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CCF考试——201312-3 最大的矩形

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

作者头像
AI那点小事
发布2020-04-20 14:15:14
4990
发布2020-04-20 14:15:14
举报
文章被收录于专栏:AI那点小事AI那点小事

概要

问题描述

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

#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;
} 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
  • 思路
  • AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档