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

时间: 2024-10-07 15:12:26

City Skyline的相关文章

BZOJ1628: [Usaco2007 Demo]City skyline

1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 256  Solved: 210[Submit][Status] Description The best part of the day for Farmer John's cows is when the sun sets. They can see the skyline of the distant city. Bessie w

[USACO2005][POJ3044]City Skyline(贪心+单调栈)

题目:http://poj.org/problem?id=3044 题意:以坐标的形式给出一张图,表示一些楼房的正视图,求出楼房的最少个数. 分析:和小学常做的立方体问题很像,很容易想到一个贪心方法,那就是尽量把矮的楼房放在高的楼房的前面,即连续的等高的一些"X"我们把它视为一座楼房. 具体的做法可以维护一个Y坐标单增的栈,从左到右读入每个坐标,将Y坐标与栈顶坐标比较: 若Y==栈顶坐标,那么接着读下面一个坐标 若Y>栈顶坐标,那么把Y坐标加入栈成为新的栈顶 若Y<栈顶坐标

[Usaco2007 Demo][BZOJ1628] City skyline

1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 320  Solved: 260[Submit][Status][Discuss] Description Input 第一行给出N,W 第二行到第N+1行:每行给出二个整数x,y,输入的x严格递增,并且第一个x总是1 Output 输出一个整数,表示城市中最少包含的建筑物数量 Sample Input 10 26 1 1 2 2 5

[LeetCode] 807. Max Increase to Keep City Skyline

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 there. We are allowed to increase the height of any number of buildings, by any amount (the amounts can be differen

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 there. We are allowed to increase the height of any number of buildings, by any amount (the amounts can be different for different buildings). Heig

(Medium) Max Increase to Keep City SkyLine LeetCode

Description: In a 2 dimensional array grid, each value grid[i][j] represents the height of a building located there. We are allowed to increase the height of any number of buildings, by any amount (the amounts can be different for different buildings

bzoj1683[Usaco2005 Nov]City skyline 城市地平线

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1683 Input 第1行:2个用空格隔开的整数N和W. 第2到N+1行:每行包括2个用空格隔开的整数x,y,其意义如题中所述.输入中的x严格递增,并且第一个z总是x. Output 输出一个整数,表示城市中最少包含的建筑物数量. Sample Input 10 26 1 1 2 2 5 1 6 3 8 1 11 0 15 2 17 3 20 2 22 1 INPUT DETAILS: T

BZOJ 1628 [Usaco2007 Demo]City skyline:单调栈

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1628 题意: 题解: 单调栈. 单调性: 栈内元素高度递增. 一旦出现比栈顶小的元素,则表明一栋房子的结束. 入栈: 如果出现了一个新的高度b(栈中没有),则入栈. 表明从现在开始,一定有一栋高度为b的房子,只是我们不知道它在哪里结束而已. 出栈: 对于现在的高度b,将栈中所有高度 > b的元素都出栈. 因为此时比b高的房子不得不结束. 每出栈一个元素,ans++. 注:最后要再多算一次

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY