题目简介
给定平面上的一些点,求最近点对。
说明
本来是个复杂的分治题,不知道是不是因为数据弱我疯狂取min也AC了……留坑待填。
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
struct point{double x, y;}p[100001];
bool cmp(point a, point b)
{
if (fabs(a.x-b.x) < 1e-8) return a.y < b.y;
else return a.x < b.x;
}
double dis(point a, point b)
{
return sqrt(pow((a.x-b.x), 2) + pow((a.y-b.y), 2));
}
double dnc(point p[], int n)
{
double m = 1e10;
if (n == 2) return dis(p[0], p[1]);
for(int i = 0; i < n-2; ++i)
m = min(m, min(dis(p[i], p[i+1]), min(dis(p[i], p[i+2]), dis(p[i+1], p[i+2]))));
return m;
}
int main(){
int n;
while(~scanf("%d", &n) && n){
for (int i = 0; i < n; ++i)
scanf("%lf%lf", &p[i].x, &p[i].y);
sort(p, p + n, cmp);
printf("%.2f\n", dnc(p, n) / 2);
}
return 0;
}