问题描述
在横轴上放了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之间矩形的个数,如果得到的答案大于最终要输出的答案,那么就把这个答案赋值给最终答案。
说的比较笼统,一会再深入讲解,先看看代码:
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<vector>
 4 #include<string>
 5 #include<cstring>
 6 using namespace std;
 7 const int N = 1003;
 8 int a[N];
 9
10 int main(){
11     int n;
12     while(cin>>n){
13         for(int i =0  ;i < n;++i){          //输入数据
14             cin>>a[i];
15         }
16         int ans = -1;                  //先设置最终答案ans为-1
17         for(int i = 0 ; i< n;++i){          //对于每个元素a[i]
18             int low = a[i];              //当前最小值low设置为a[i]
19             for(int j =  i ; j < n;++j){       //对于i后面的每个元素
20                 if(low > a[j])            //如果a[j] 比 当前设置的最小值还要小,那么最小值设置为a[j]
21                     low = a[j];
22                 int temp = (j - i + 1) * low;      //设置标记变量temp 为这段区间中的总和
23                 if(temp > ans)              
24                     ans = temp;
25             }
26         }
27         cout<<ans<<endl;
28     }
29 return 0;
30 }

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

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

其实,在不断向右边遍历的过程中,我们如果把下标 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的左方向遍历过程、、、

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

转载于:https://www.cnblogs.com/dqsBK/p/5312578.html

CCF-CSP 最大的矩形相关推荐

  1. CCF CSP认证菜鸟刷题日志

    CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...

  2. CCF CSP认证考试题解目录

    由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...

  3. CCF CSP 201609-2 火车购票

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

  4. 计算机能力挑战赛_蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、计算机能力挑战赛、软考等大学生编程比赛/考试介绍...

    介绍7个适合普通大学生参加的编程比赛/考试(注:有的比赛如蓝桥杯有多种赛别,本文仅介绍其中的程序设计/编程比赛). 编程入门书籍推荐<算法笔记>,内容详细易懂,对新手非常友好,描述语言为C ...

  5. 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系

    原文链接:以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系 发布单位:学会      发布时间:2017-01-20 16:16 作者:陆建峰    余立功 摘要:为提升计算机专业类学生 ...

  6. ccf csp寻宝!大冒险!(C语言)

    ccf csp寻宝!大冒险! 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期--直到-- 某天,小 P 获得了一张神秘的藏 ...

  7. 【CCF CSP】【Python】【201903-1】小中大

    [CCF CSP][Python][201903-1] 小中大 题目要求 代码实现 主要方法 提交验证 题目要求 代码实现 1.初始版(又名完全原创版.欠优化版.无法体现"人生苦短,我用PY ...

  8. 参加CCF CSP认证者须知

    发布单位:中国计算机学会      发布时间:2014-11-11 15:06    凡有意参加CCF CSP认证者,请在cspro.org网站上注册.报名.缴费.打印准考证,参加认证后可以在网站查询 ...

  9. CCF CSP 行车路线 java 201712_4

    CCF CSP 行车路线 java 201712_4 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好 ...

  10. CCF CSP认证考试在线评测系统

    关于CCF CSP认证考试在线评测系统 CCF CSP认证考试简介 CCF是中国计算机学会的简称.CCF计算机软件能力认证(简称CCF CSP认证考试)是CCF于2014年推出,是CCF计算机职业资格 ...

最新文章

  1. 提高C++性能的编程技术笔记:总结
  2. anndroid ndk使用
  3. mysql中表名为关键字的处理方法
  4. 浅谈机器人产品落地全过程
  5. sql server如何输出排序序号_Group by中子查询order by排序失效问题分析
  6. 2135亿!2018 双11阿里数据库技术战报新鲜出炉
  7. s2sh删掉原本的s2sh project capabilities后重新添加它们
  8. Codeforces D - High Load
  9. GB28181系统设计(四)-横向扩展和纵向扩展
  10. QQ for Linux启动闪退问题
  11. M1芯片的Mac电脑如何进入到恢复模式?
  12. Ubuntu下挂载Windows分区
  13. gflags使用详解
  14. Go语言在大数据时代应用前景
  15. kernelbase故障模块_错误模块名称: KERNELBASE.dll
  16. 微信小程序之头像裁剪,添加字幕,生成新图片下载等 解决真机调试和开发者工具 图片不显示等问题
  17. linux设置apn脚本apn,LINUX 4G pppd接入点设置
  18. 【容器】Podman容器快速上手
  19. Spring中的事务控制(Transacion Management with Spring)
  20. qlv如何转换为mp4格式?怎样将qlv转换成mp4格式?

热门文章

  1. java 服务器读取客户端文件,java 服务器读取客户端文件
  2. android让一个控件跟上面控件对其,学个明白--Android控件架构
  3. android studio闪退代码不报错_代码不报错,不代表真的没错
  4. 南岸焊接机器人厂_造船三部高效焊接工艺技术年鉴
  5. c++ 从 string 到 short
  6. arduino 机器视觉编程_万物皆可仿真的MATLAB/Simulink神奇在哪?解析如何将其应用于一整套机器人设计开发流程...
  7. 《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》
  8. leetcode 51. N 皇后 思考分析
  9. java 检查目录是否存在_如何检查Java目录是否存在?
  10. android对象缓存,Android简单实现 缓存数据