HDU1007 查找平面最近点对 - Sun1956 - CSDN博客
这个博客讲的不错。。不过画图发现并不需要取
6
个相邻的点,
分析一下复杂度。。类似线段树,solve
运行了
O(n)
次,均摊每次运行处理的点的数量应该是
O(logn)
个,排序的常数很小,因此总复杂度大概是
O(nlogn)
。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
const double INF=1e15;
struct Point
{
double x,y;
}p[N];
double dis(int i,int j)
{
return (p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
}
double solve(int l,int r)
{
if(l>=r) return INF;
int m=(l+r)>>1;
double k=min(solve(l,m),solve(m+1,r));
sort(p+l,p+r+1,[](Point &a,Point &b){ return a.y<b.y; });
for(int i=l;i<=r;++i)
for(int j=i+1;j<l+3&&j<=r;++j)
k=min(k,dis(i,j));
return k;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0) break;
for(int i=0;i<n;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p,p+n,[](Point &a,Point &b){ return a.x<b.x; });
printf("%.2f\n",sqrt(solve(0,n-1))/2);
}
return 0;
}