#include<cstdio>
#include<cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#define M 100010
using namespace std;
int n;
struct point
{
double x,y;
}p[M];
int a[M];
double cmp(point aa,point bb)
{
return aa.x<bb.x;
}
double cmpy(int a,int b)
{
return p[a].y<p[b].y;
}
double dis(point aa,point bb)
{
return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y));
}
double find(int l,int r)//分治法
{
if(l+1==r)
return dis(p[l],p[r]);
else if(l+2==r)
return min(dis(p[l],p[l+1]),min(dis(p[l],p[r]),dis(p[l+1],p[r])));
int mid=(l+r)>>1;
double ans=min(find(l,mid),find(mid+1,r));//先在左右两个区间求最小值
int cnt=0;
//再比较左右各占一个时的情况
for(int i=l; i<=r; i++)
if(p[i].x>=p[mid].x-ans&&p[i].x<=p[mid].x+ans)
a[cnt++]=i;
sort(a,a+cnt,cmpy);
for(int i=0; i<cnt; i++)
{
for(int j=i+1; j<cnt; j++)
{
if(p[a[j]].y-p[a[i]].y>=ans)break;
ans=min(ans,dis(p[a[j]],p[a[i]]));
}
}
return ans;
}
int main()
{
while(scanf("%d",&n)==1&&n)
{
for(int i=0; i<n; i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p,p+n,cmp);
printf("%.2lf\n",find(0,n-1)/2);
}
return 0;
}
hdu 1007最近点对
最新推荐文章于 2019-12-18 20:08:00 发布