问题描述
  在横轴上放了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. SSH整合创建SessionFactory

    在spring中的 applicationContext.xml中配置如下信息 <!-- 配置数据连接类 --> <bean id="dataSource" cl ...

  2. IOS touch event animation 转动的风车

    最近开始学习IOS的开发,师兄给我提出一个需求:实现一个可拖动的转盘.师兄提示我说利用touch event和UIView animation.经过一两天的折腾边学边做,算是实现了基本功能.这里写写加 ...

  3. Android 中单位讲解

    1. dip(dp): device independent pixels(设备独立像素). dp也就是dip.这个和sp基本类似.如果设置表示长度.高度等属性时可以使用dp 或sp.但如果设置字体, ...

  4. 如何调用在$(function(){ //内部函数代码 });

    这个文件主要完成如何调用在jquery内部定义的函数,主要有两种方法 法①: <script type="text/javascript"> $(function() ...

  5. 直插式精巧I/O模块:WIZ812MJ数据手册V1.1

    1. 简介 WIZ812MJ是一款内嵌了W5100(硬件TCP/IP芯片,内置PHY).带其他胶合逻辑的MAG-JACK(带变压器的RJ45)网络模块.它可以当作一个组件使用,而且不需要为W5100和 ...

  6. vs2012中程序集生成无法自动在网站Bin目录下生成Dll文件?(已解决!)

    最近,突然发现生成程序集后,网站bin目录下dll没有更新,也没有自动生成dll文件,通过近半个小时的摸索和实验,找到了解决方法: 1.右键网站,不是项目,选择[属性页],在左侧[引用]中如果没有,就 ...

  7. DotNet加密方式解析--对称加密

    离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...

  8. IDEA异常解决: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    有时候解决问题不仅仅是解决问题.-----jstarseven 最近因为开发需要,需要搭建一个ssm开发框架,采用了开发工具IDEA. 整合完了SSM开发框架之后,发布的时候出现org.apache. ...

  9. JS的运算问题……

    在公司实习期间,发现了一个JS很奇怪的问题. 今天在这里来探讨一下 第一个问题 在生活中或者其他语言中一般相加是这样的:0.1+0.2=0.3; 但在JS中却是这样:0.1+0.2=0.3000000 ...

  10. OC之OC与C的比较

    1. 从编写.编译.链接的流程. 1). 创建1个.m的源文件. 2). 在这个文件中写上符合OC语法规范的源代码. 3). 编译. a. 预编译: 执行预处理代码. b. 检查语法. c. 生成目标 ...