在二维平面上总共有n个点,第i个点的坐标为(x i ,y i )。请求出任意两个不同的点之间距离的平方的最小值。 输入格式 输入第一行只有一个整数n,表示点的数量。 接下来n行,每行输入一个整数对(x i ,y i ),表示点的坐标(x i ,y i )。 输出格式 输出一行,该行仅有一个整数,表示任意两个不同的点之间距离的平方的最小值。
时间: 2024-03-22 22:42:54 浏览: 24
这是一个典型的最近点对问题,可以使用分治算法来解决。具体来说,可以按照横坐标将所有点从左到右排序,然后递归地将左半边和右半边分别求解最近点对距离,然后将两边的结果取最小值。此外,还需要考虑到左右两边的点可能会跨越中线,所以还需要在中线附近进行一次合并操作,找到跨越中线的最近点对。
下面是该算法的Python实现:
```python
import sys
def dist(p1, p2):
return (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2
def closest_pair(points):
n = len(points)
if n <= 1:
return sys.maxsize
mid = n // 2
left_points = points[:mid]
right_points = points[mid:]
d = min(closest_pair(left_points), closest_pair(right_points))
strip_points = []
for point in points:
if abs(point[0] - points[mid][0]) < d:
strip_points.append(point)
strip_points.sort(key=lambda x: x[1])
for i in range(len(strip_points)):
for j in range(i+1, len(strip_points)):
if (strip_points[j][1] - strip_points[i][1])**2 >= d:
break
d = min(d, dist(strip_points[i], strip_points[j]))
return d
n = int(input())
points = []
for i in range(n):
x, y = map(int, input().split())
points.append((x, y))
points.sort()
print(closest_pair(points))
```
时间复杂度为 O(nlogn)。