#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
#include<cstring>
#include <algorithm>
#define inf 0x7fffffff
#define N 10001
#define MIN 1e-11
#define M 10000
#define LL long long
using namespace std;
int n,t,k;
struct point
{
double x,y;
};
point p[N];
int cmp(const void *a,const void *b)//
{
return (*(point*)a).x-(*(point*)b).x;
}
double chang(point p1,point p2)
{
return sqrt((p1.y-p2.y)*(p1.y-p2.y)+(p1.x-p2.x)*(p1.x-p2.x));
}
double f(point p[],int l,int r)
{
if(r==l)
return M;
if(r-l==1)
{
return chang(p[l],p[r]);
}
int mid=(l+r)>>1;
double minv=min(f(p,l,mid),f(p,mid+1,r));
int fl,fr;
int flag=0;
for(int i=l; i<=mid; i++)
if(p[i].x+minv>p[mid].x)
{
flag=1;
fl=i;
break;
}
//flag一定等于1
// if(!flag)
// return minv;
flag=0;
for(int i=r; i>mid; i--)
if(p[i].x-minv<p[mid].x)
{
flag=1;
fr=i;
break;
}
if(!flag) return minv;
for(int i=fl; i<=mid; i++)
{
for(int j=mid+1; j<=fr; j++)
{
double d=chang(p[i],p[j]);
if(d<minv)
minv=d;
}
}
return minv;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
while(scanf("%d",&n)&&n)
{
for(int i=0; i<n; ++i)
scanf("%lf%lf",&p[i].x,&p[i].y);
qsort(p,n,sizeof(p[0]),cmp);
// for(int i=0;i<n;++i)
// printf("%lf %lf\n",p[i].x,p[i].y);
double length=f(p,0,n-1);
if(length>=M)
printf("INFINITY\n");
else
printf("%.4lf\n",length);
}
return 0;
}
10245 - The Closest Pair ----------水题--二分
最新推荐文章于 2024-07-08 15:15:56 发布