分治 平面上的最近点对
分治 平面上的最近点对
题目描述
给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。
输入格式:
多行输入
第一行:n;2≤n≤200000
接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。
输出格式:
仅一行,一个实数,表示最短距离,精确到小数点后面4位。
输入输出样例
输入样例#1:
1 | 10 |
输出样例#1:
1 | 1.0000 |
说明
0<=x,y<=10^9
题目分析
先把点坐标x从小到大排序,然后从中间分开,最短距离有以下两种情况:
- 最短距离两点都在同一侧:
对于这种来说递归的终止时只需计算2-3点的距离,设计这两种情况的递归终止条件即可。 - 最短距离两点分别在两侧:
- 由于我们先递归求得左右两侧的最短距离
minDistance1
和minDistance2
- 求出左右两侧的较短距离
minDistance = min{minDistance1,minDistance2}
; - 现在只需要比距离d小的点,这时我们以中间的坐标x为准,对[x-d,x+d]之间的点暴力进行判断,找出最小值就可以得到答案了
- 由于我们先递归求得左右两侧的最短距离
代码详解
1 |
|
代码思路,编辑格式不易,大家觉得还可以可以点赞、收藏、关注一下吧!