City Skyline
题目大意:(poj 3044)
给出城市的正视图,所有的大楼都是矩形,给出正视图每个高度改变时的坐标,问最少有多少大楼。一共N个矩形,N<=50000
解题过程:
首先可以把问题转化一下:有N块木板要粉刷,每次只能刷矩形,并且矩形要挨着地面,也不能刷到外面,最少刷多少次。
题目给出的每块木板的宽度其实是木有用的,因为相同高度且挨在一起的木板肯定同时刷.所以可以把所有的宽度缩成1.
那么根据贪心的思想,如果横着刷一次可以刷掉多个矩形,那么肯定横着刷。但是数据范围有点大,想不出什么好的办法,我就用了分治的方法。每次找到区间内高度最矮的,然后横着刷一次,再以这个点为边界左右分治。很明显如果高度是单调增的,复杂度会退化到O(N2) 但还是被我32ms水过去了。。。
下面介绍另外3种方法:
A: 暴力处理出从每个点出发向右最多能刷多远(扫描到第一个比它矮的就停止),如果刷的路上碰到和它一样高的,就打个标记,下次就不用处理打过标记的点。 该方法比分治还要暴力,16ms水过去,但是很明显也会被单调性比较明显的数据卡死。
具体代码参考http://blog.csdn.net/z309241990/article/details/8596517
B:对方法A进行优化,从右往左扫,用类似并查集的方法处理出每个点向右最多能刷多远.复杂度不好估计,但是也可以出数据卡它,比如 5 9 8 7 4 处理最左边的那个5的时候需要扫4次找到4.如果这样的数据循环出现,那么时间显然会变慢。但是对付本题N<=50000的数据, 就算上面的数据循环出现k次,那么平均长度是N/k,最左边的点需要k次查找,其它点可以看做只要1次查找,所以还是O(N)级别的。 所以还是非常不错的一个办法。
具体代码参考http://www.cnblogs.com/tmeteorj/archive/2012/09/04/2670957.html
代码中y[i]表示高度为i的最远刷到哪里.
C:用单调栈优化方法A.对于一个高为h的点x,如果它前面有一些比它高的点,那么从那些点往右边刷肯定到达当前x.所以从栈中弹出,并ans++... 实在很难描述,看代码理解吧.时间复杂度O(N),应该算是最完美的算法了。
具体代码参考http://blog.csdn.net/u010770930/article/details/20155189
City Skyline的更多相关文章
- BZOJ1628: [Usaco2007 Demo]City skyline
1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 256 Solved: 210[Su ...
- Leetcode 807 Max Increase to Keep City Skyline 不变天际线
Max Increase to Keep City Skyline In a 2 dimensional array grid, each value grid[i][j] represents th ...
- LC 807. Max Increase to Keep City Skyline
In a 2 dimensional array grid, each value grid[i][j] represents the height of a building located the ...
- LeetCode #807. Max Increase to Keep City Skyline 保持城市天际线
https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/ 执行用时 : 3 ms, 在Max Increase to Ke ...
- [Swift]LeetCode807. 保持城市天际线 | Max Increase to Keep City Skyline
In a 2 dimensional array grid, each value grid[i][j]represents the height of a building located ther ...
- [LeetCode] Max Increase to Keep City Skyline 保持城市天际线的最大增高
In a 2 dimensional array grid, each value grid[i][j] represents the height of a building located the ...
- [LeetCode&Python] Problem 807. Max Increase to Keep City Skyline
In a 2 dimensional array grid, each value grid[i][j] represents the height of a building located the ...
- 【BZOJ】1628 && 1683: [Usaco2007 Demo]City skyline 城市地平线(单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=1628 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- 【Leetcode】807. Max Increase to Keep City Skyline
Description In a 2 dimensional array grid, each value grid[i][j] represents the height of a building ...
- 【LeetCode】807. Max Increase to Keep City Skyline 解题报告(Python &C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
随机推荐
- JavaWeb学习总结(十一)--JDBC之批处理
一.批处理的介绍 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.批处理只针对更新(增.删.改)语句,批 ...
- Erlang安装笔记
今天,为了安装RabbitMQ,需要安装Erlang,中间遇到了一些坑,记录下来. 1. 下载Erlang安装包 http://www.erlang.org/downloads http://erla ...
- ctrl+enter提交留言
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...
- ORA-12705: Cannot access NLS data files or invalid environment specified
ASM实例无法启动 [grid@data ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.4.0 Production on Fri Sep 11 0 ...
- Js_动画显示背景图片
jAni是一个可以动画显示背景图片的jQuery插件.这个插件基本上是GIF动画的一个替代品,但是他有他的好处.所有浏览器都支持GIF形式的动画格式,而且也不需要额外的javaScript代码和标记. ...
- iOS开发 在scrollView上增加滑动手势(Pan)
view上有一个scrollView,现在想在view上加一个Pan手势,需求是:当向下划的时候,整个view动,但是scrollView不动:其它情况下scrollView动而view不动. -(B ...
- Python主文件路径和当前模块路径
主执行文件路径sys.argv[0] ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
- Python项目实战
编程只有不断练习才能掌握其精髓,多练练网上的习题和项目,才能掌握python的精髓. Python的模块和包是出了名的多,因此你不必自己从底层开始写起,只需要看懂模块和包的使用文档就可以了,因此掌握一 ...
- [转]Android 使用Fragment界面向下跳转并一级级返回
1.首先贴上项目结构图: 2.先添加一个接口文件BackHandledInterface.java,定义一个setSelectedFragment方法用于设置当前加载的Fragment在栈顶,主界 ...