此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle

Smallest Bounding Rectangle

Given the Cartesian coordinates of n(>0)2-dimensional points, write a program that computes the area of their smallest bounding rectangle (smallest rectangle containing all the given points).

Input

The input le may contain multiple test cases. Each test case begins with a line containing a positive 
integer n(<1001) indicating the number of points in this test case. Then follows n lines each containing 
two real numbers giving respectively the x - and y 
-coordinates of a point. The input terminates with a 
test case containing a value 0 for n which must not be processed.

Output

For each test case in the input print a line containing the area of the smallest bounding rectangle 
rounded to the 4th digit after the decimal point.

Sample Input


-3.000 5.000 
7.000 9.000 
17.000 5.000 

10.000 10.000 
10.000 20.000 
20.000 20.000 
20.000 10.000 
0

Sample Output

80.0000 
100.0000

给定平面上n个点的坐标,求能够覆盖所有这些点的最小矩形面积。这个问题难就难在,这个矩形可以倾斜放置(边不必平行于坐标轴)。

这里的倾斜放置很不好处理,因为我们不知道这个矩形最终会倾斜多少度。假设我们知道这个矩形的倾角是α,那么答案就很简单了:矩形面积最小时四条边一定都挨着某个点。也就是说,四条边的斜率已经都知道了的话,只需要让这些边从外面不断逼近这个点集直到碰到了某个点。你不必知道这个具体应该怎么实现,只需要理解这可以通过某种方法计算出来,毕竟我们的重点在下面的过程。

我们的算法很显然了:枚举矩形的倾角,对于每一个倾角,我们都能计算出最小的矩形面积,最后取一个最小值。

这个算法是否是正确的呢?我们不能说它是否正确,因为它根本不可能实现。矩形的倾角是一个实数,它有无数种可能,你永远不可能枚举每一种情况。我们说,矩形的倾角是一个“连续的”变量,它是我们无法枚举这个倾角的根本原因。我们需要一种方法,把这个“连续的”变量变成一个一个的值,变成一个“离散的”变量。这个过程也就是所谓的离散化。

我们可以证明,最小面积的矩形不但要求四条边上都有一个点,而且还要求至少一条边上有两个或两个以上的点。试想,如果每条边上都只有一个点,则我们总可以把这个矩形旋转一点使得这个矩形变“松”,从而有余地得到更小的矩形。于是我们发现,矩形的某条边的斜率必然与某两点的连线相同。如果我们计算出了所有过两点的直线的倾角,那么α的取值只有可能是这些倾角或它减去90度后的角(直线按“\”方向倾斜时)这么C(n,2)种。我们说,这个“倾角”已经被我们“离散化”了。虽然这个算法仍然有优化的余地,但此时我们已经达到了本文开头所说的目的。

时间: 2024-10-01 20:08:08

此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle的相关文章

【最小矩形面积覆盖:凸包+旋转卡壳】UVA 10173 Smallest Bounding Rectangle

[最小矩形面积覆盖:凸包+旋转卡壳]UVA 10173 Smallest Bounding Rectangle 题目链接:UVA 10173 Smallest Bounding Rectangle 题目大意 给你n个点,求能够覆盖所有点集的最小矩形面积. 笔者的第2道凸包题目,凸包 + 旋转卡壳,实现点集的最小矩形面积覆盖问题 ">=0"写成"<=0"坑了我一下午!QAQ 说一下思路 ①Graham's Scan法构建凸包,时间复杂度O(nlogn) ②

uva 12307 - Smallest Enclosing Rectangle(旋转卡壳)

题目链接:uva 12307 - Smallest Enclosing Rectangle 两组踵对点围成长方形,枚举出所有可行长方形维护最小值. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <complex> #include <algorithm> using namespace std; typedef pair

HDU5124:lines(线段树+离散化)或(离散化思想)

http://acm.hdu.edu.cn/showproblem.php?pid=5124 Problem Description John has several lines. The lines are covered on the X axis. Let A is a point which is covered by the most lines. John wants to know how many lines cover A. Input The first line conta

POJ-2585-Mayor&#39;s posters-成段更新+(hash)离散化思想

题目链接:http://poj.org/problem?id=2528 这个题目是很经典的离散化成段更新线段树问题,可以试着多做几次,充分理解: 转自:http://www.notonlysuccess.com/index.php/segment-tree-complete/ 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我

【map离散化+打表】UVA 11995 I Can Guess the Data Structure!

[map离散化+打表]UVA 11995 I Can Guess the Data Structure! map关联容器:有序 + 映射,查找的复杂度O(nlogn) 题目大意 给你n个数构成的数组,求数v第k次出现的下标值(下标从1开始) – 说一下思路 这题很显然要打表预处理,关键是怎么打这张表 1.首先我们观察到v很大,开一个二维数组data[v][k]肯定存储不了,所以用map离散化(自动有序编号,避免空间浪费) 2.data[v]肯定是一个变长的数组,存储数据v出现0,1,2次--的下

UVA.11997- K Smallest Sums, OJ4TH.368 - Magry&#39;s Sum I

感谢算法助教们给了这么一个好题... 题意: 给出n个数组,每个数组有n个元素,我们从每个数组中挑选一个元素,共计n个元素求和,得到共计 $ k^k $ 种sum,求sum中的最小n个值. 利用二分查找符合条件的最大sum值,dfs搜索判断二分条件.最坏时间复杂度 $O(n^{2}log(n*Max(a[i][j])) $ 刘汝佳训练指南上给出了优先队列多路归并的思想. 思路1代码: 1 #include<cstdio> 2 #include<iostream> 3 #includ

UVA 10173

bitch bitch bitch... TLE,WA一大坨,我是在拿生命来JUDGE啊.. 不得不说,UVA上的数据根本不是随机的,而是有预谋的. for(int i=2;i<n;i++){ while(stop>1&&cross(p[i],p[st[stop-1]],p[st[stop-2]])>=0) stop--;   //这个我本来是cross(p[i],p[st[stop-1]],p[st[stop-2]])>0 st[stop++]=i; } 因为没加

简单几何(数学公式+凸包) UVA 11168 Airport

题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为Ax + By + C = 0.点(x0, y0)到直线的距离为:fabs(Ax0+By0+C)/sqrt(A*A+B*B). 所以只要先求出x的和以及y的和,能在O (1)计算所有距离和. 两点式直线方程p1 (x1, y1),p2 (x2, y2)转换成一般式直线方程:A = y1 - y2, B

HDU2883kebab(最大流ISAP)离散化思想建图

kebab Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1145    Accepted Submission(s): 472 Problem Description Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled on