#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef struct
{
double x;
double y;
}Node;
Node stu[100010];
Node personx[100010];
Node persony[100010];
bool cmp(Node X,Node Y)
{
return X.x<Y.x;
}
bool cmp1(Node X,Node Y)
{
return X.y<Y.y;
}
double Num(Node x1,Node y1)
{
return sqrt((x1.x-y1.x)*(x1.x-y1.x)+(x1.y-y1.y)*(x1.y-y1.y));
}
double Solve(int l,int r)
{
int i,j;
if(l==r-1)return Num(personx[l],personx[r]);
if(l+2==r)return min(Num(personx[l],personx[l+1]),min(Num(personx[l+1],personx[r]),Num(personx[l],personx[r])));
int mid=(l+r)>>1;
int cnt=0;
double ans=min(Solve(l,mid),Solve(mid+1,r));
for(i=l;i<=r;i++)
{
if(fabs(personx[i].x-persony[mid].x)<ans)
persony[++cnt]=personx[i];
}
sort(persony+1,persony+cnt+1,cmp1);
for(i=1;i<cnt;i++)
{
for(j=i+1;j<=cnt;j++)
{
if(persony[j].y-persony[i].y>=ans)break;
ans=min(ans,Num(persony[i],persony[j]));
}
}
return ans;
}
int main()
{
int N;
int i,j;
while(scanf("%d",&N)&&N)
{
for(i=1;i<=N;i++)
{
scanf("%lf%lf",&stu[i].x,&stu[i].y);
personx[i]=stu[i];
}
sort(personx+1,personx+N+1,cmp);
printf("%.2lf\n",Solve(1,N)/2);
}
return 0;
}
杭电1007分治法
最新推荐文章于 2019-11-26 16:32:48 发布