算法问题实战策略 FENCE
地址 https://algospot.com/judge/problem/read/FENCE
开始考虑暴力遍历
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> using namespace std; int n;
int m; vector<int> h; int func()
{
int ret = ; for (int i = ; i < h.size(); i++) {
int minHeight = h[i];
for (int j = i; j < h.size(); j++) {
minHeight = min(minHeight,h[j]);
ret = max(ret, (j - i + )*minHeight);
}
} return ret;
} int main()
{
cin >> n; while (n--) {
h.clear();
m = ;
cin >> m; for (int i = ; i < m; i++) {
int t;
cin >> t;
h.push_back(t);
} cout << func() << endl;
} return ;
}
后面优化 采取分冶的办法 最大值要么在左边 要么在右边 要么经过左右 三种情况。
左右两种情况采取递归的方式进行计算
穿越分界由左到右的情况则采用以下方法计算:
取中间两块木板 长方形长度为2 高度为两筐木板短的那块,然后向两边扩展,选取左边或者右边较高的那块木板扩展.每次扩展计算面积,记录当前最大面积。最后得到穿越分界由左到右的最大面积
之所以会取较高的木板扩展是因为面积要以最低的高度计算 如果两边扩展不取较高的而是取较低的木板 那么如果扩展的木板低于当前高度 会遗漏一些情况未计算面积 从而产生错误.
代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> using namespace std; int n;
int m;
vector<int> h;
int solve(int left, int right)
{
if (left == right) return h[left];
int mid = (left + right) / ;
int ret = max(solve(left, mid), solve(mid + , right)); int lo = mid, hi = mid + ;
int height = min(h[lo], h[hi]);
ret = max(ret, height * );
while (left < lo || hi < right) {
if (hi < right && (lo == left || h[lo - ] < h[hi + ])) {
++hi;
height = min(height,h[hi]);
}
else {
--lo;
height = min(height,h[lo]);
}
ret = max(ret, height*(hi - lo + ));
}
return ret;
} int main()
{
cin >> n; while (n--) {
h.clear();
m = ;
cin >> m;
for (int i = ; i < m; i++) {
int t;
cin >> t;
h.push_back(t);
} cout << solve( , m-) << endl;
} return ;
}
算法问题实战策略 FENCE的更多相关文章
- 算法问题实战策略 PICNIC
下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...
- 《算法问题实战策略》-chaper7-穷举法
关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...
- 《算法问题实战策略》-chaper32-网络流
基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...
- 《算法问题实战策略》-chaper13-数值分析
这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- 《算法问题实战策略》-chaper21-树的实现和遍历
这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...
- 算法问题实战策略 QUADTREE
地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
随机推荐
- SAP-BP 创建客商(摘抄)
FORM frm_bp02 . * 更改供应商所需变量 DATA:l_xfeld TYPE xfeld, "复选框 ls_data TYPE vmds_ei_main, "供应商总 ...
- 从零开始学vuejs
最近一段时间都花在了学习vue上,还总是断断续续的,学习的效果不是很明显,思考了好久了,应该是没有进行一个系统的总结,导致很多知识点总是似是而非,而且也有一部分是思维还没有从java转变过来,废话不多 ...
- SAP FI 问题汇总
记录工作中遇到的问题汇总 1.固定资产折旧码的设置 2.与资产有关的日期 3.如何添加固定资产分类
- JS 参考手册
JS 参考手册 JavaScript 对象 HTML DOM 对象
- dbms_profiler
@?/rdbms/admin/profload.sql @?/rdbms/admin/proftab.sql CREATE or replace PUBLIC SYNONYM plsql_profil ...
- python将字符串插入表中避免单双引号问题
调用pymysql.escape_string('向数据库插入的数据') 例如: import pymysql str = 'as"sdf' print(pymysql.escape_str ...
- 九、ITK-VTK混合编程--将序列dcm图像通过ITK读去并通过VTK显示出来
一.初步介绍 上一个博客里面我记录了VTK的安装,以及相关的工程代码的构建,但是实际上上一个博客测试的代码的例子仅仅只是VTK程序的例子.而我实际上希望能够实现的是VTK和ITK混合编程. 在这里还是 ...
- 电竞行业年轻新潮流yabo055解读亚博电竞3.0时代
据相关统计,目前我国电竞行业yabo055点康姆的电竞竞菜市场规模最少在百亿级别以上,这是在以前完全不能想象的.2018年,中国正式开始进入Gaming 3.0时代.想要投入电竞行业的人员越来越多,不 ...
- VMware Workstation下载-安装-破解-秘钥
永不过期序列号:UZ792-DHF8J-M81XP-MGM5T-MCAF2 Vmware15注册机下载:链接: https://pan.baidu.com/s/1KbLq71tw_5pUKv2lRjF ...
- java之集合(Set、List、Map)
java集合类存放于java,uti包中,是一个用于存放对象的容器. 集合只能存放对象,比如存入的是int型数据1,那么它会自动转换成Integer包装类后再存入: 集合存放的是多个对象的引用,对象本 ...