问题描述
  在横轴上放了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
 
思路:第一次看见这题的想法就是:
  1、先输入数据,存入一个数组里
  2、遍历数组中的每个元素,并找出当前数组元素左边和右边第一个小于当前数组元素的数
  3、由刚才得到的数组元素的下标,计算这段距离中有多少个矩形,
  4、当前元素 * 距离 = temp
  5、比较最终答案和temp,如果temp大于最终答案ans,那么ans = temp,否则继续
但是提交之后发现会超时,每次反复的运算大大增加了时间复杂度,所以笔者从别人那里借鉴到一种方法:
  这种方法的大体思路是这样的,输入数据之后,遍历每个数据,对于其中的每一个数据a[i], 从下表i到n-1之间,找到最小的数a[j],用它乘以i到j之间矩形的个数,如果得到的答案大于最终要输出的答案,那么就把这个答案赋值给最终答案。
  说的比较笼统,一会再深入讲解,先看看代码:
 #include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
const int N = ;
int a[N]; int main(){
int n;
while(cin>>n){
for(int i = ;i < n;++i){          //输入数据
cin>>a[i];
}
int ans = -;                  //先设置最终答案ans为-1
for(int i = ; i< n;++i){          //对于每个元素a[i]
int low = a[i];              //当前最小值low设置为a[i]
for(int j = i ; j < n;++j){       //对于i后面的每个元素
if(low > a[j])            //如果a[j] 比 当前设置的最小值还要小,那么最小值设置为a[j]
low = a[j];
int temp = (j - i + ) * low;      //设置标记变量temp 为这段区间中的总和
if(temp > ans)              
ans = temp;
}
}
cout<<ans<<endl;
}
return ;
}

我想还有许多人对二层循环那里不明白,其实笔者刚开始也不太明白,下面就来讲解一下这里吧、、、

有一个问题,就是总是向右边遍历,那么左边的数据怎么算?

其实,在不断向右边遍历的过程中,我们如果把下标 i  看成后面每个数的左边界就好了、、、

假如 i 现在为0,那么右边的每个数的左边界都是 0,并且按照代码中写的,不断找到i 到j之间的最小值,那么 0 到 i 之间的最小值的最终结果是不是就是n * 最小值呢

如果还不明白,还可以这么想,假如就三个数据,a1,a2,a3, 假如a1 比a2 小的前提下,

(1)a3 大于 a2 并且大于 a1 那么对于a3来说,最大值就是a3

(2)a3小于a2 并且大于a1 ,那么对于a3来说,最大值就是a3 * 2

、、、、、

所以从前向后遍历的过程,其实就是不断对于下标为i后面的某个元素j的左方向遍历过程、、、

大家懂了吗,如果还有问题,希望大家能提出来,笔者深知能力有限,但是能帮助大家的还是会尽力的、、

CCF-CSP 最大的矩形的更多相关文章

  1. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  2. CCF CSP 201409-2 画图

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-2 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y ...

  3. CCF CSP 201403-2 窗口

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-2 窗口 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标 ...

  4. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  5. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  6. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  7. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  8. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  9. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  10. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

随机推荐

  1. asp.net MVC实现文章的“上一篇下一篇”

    由于这个东西的原理没有什么难的(只是实现的时候有少量的坑),故直接上代码以便查阅.另:本文给出的Action附送了点击量统计. public ActionResult SingleNews(int? ...

  2. IIS日志字段详解

    IIS日志字段详解 抓住8月的尾巴,弥补下这个月的空白,事情太多,忘了写博客这回事了. IIS日志字段设置                                          网站运营时 ...

  3. npm 安装与常用命令

    下载nodejs并安装,会附带安装npm工具https://nodejs.org/en/download/ npm 常用命令#在执行命令时需要管理员权限,mac请用sudo来执行,windows请使用 ...

  4. iOS 开发之Target-action模式

    Target-action:目标-动作模式,它贯穿于iOS开发始终.但是对于初学者来说,还是被这种模式搞得一头雾水. 其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那 ...

  5. 伪ajax上传文件

    伪ajax上传文件   最近在折腾伪ajax异步上传文件. 网上搜索了一下,发现大部分方法的input file控件都局限于form中,如果是在form外的呢? 必须动态生成一个临时form和临时if ...

  6. 设置共享文件夹,samba和chmod到底谁的权限大

    1,必备知识.已经知道的请跳过. 首先科普一下这两个东西:samba和chmod其实是完全不同层面的东西,一个是共享服务协议,一个是权限设置语句.但是他们有一个共同的用途:可以用来实现设置一个共享文件 ...

  7. 常用WebService一览表

    天气预报Web服务,数据来源于中国气象局 Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmx Disco     ...

  8. STL---基本算法---<stl_algobase.h>概述

    通过一个实例来说明这些算法的接口使用: #include <iostream> #include <algorithm> #include <functional> ...

  9. hdu 1998 奇数阶魔方(找规律+模拟)

    应该不算太水吧. 17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18 ...

  10. Elasticsearch 2.3 (ELK)Geo_point绘图、日志Date时间获取实例

    前言:本文源于天天是雾霾新闻,我想利用kibana画一下一线城市雾霾图,希望对想利用经纬度在kibana绘图和获取日志本身时间绘图的同学有所帮助.有什么疑问或者纠错,可以给我发邮件 一.数据准备 为了 ...