#include <iostream>
#include <cstddef>
#include <stdexcept>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <set>
#include <map>
#include <queue>
#include <bitset>
#include <ctime>
#include <stack>
#include <vector>
#include <iterator>
using namespace std;
const int N = 200002;
const double INF = 1e20;
const double EPS = 1e-8;
struct point
{
double x,y;
} p[N];
int idx[N],n;
inline int sig(double x,double y)
{
if(fabs(x-y)<EPS) return 0;
return x<y?1:-1;
}
inline double dst(point p,point q)
{
return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));
}
bool cmp_x(point p,point q)
{
return sig(p.x,q.x) > 0;
}
bool cmp_y(int a,int b)
{
return sig(p[a].y,p[b].y) > 0;
}
double divide(int s,int t)
{
if(s >= t-1) return INF;
if(s+2 == t) return dst(p[s],p[s+1]);
int i;
int mid = (s+t)>>1;
for(i=mid;i>=s && !sig(p[i].x,p[mid].x);--i);
double ret = divide(s,i);
for(i=mid+1;i<t && !sig(p[i].x,p[mid].x);++i);
ret = min(ret,divide(i,t));
int k = 0;
for(i=mid;i>=s && sig(p[mid].x - p[i].x,ret)>=0;--i)
idx[k++] = i;
for(i=mid+1;i<t && sig(p[i].x-p[mid].x, ret)>=0;++i)
idx[k++] = i;
//cout << k << endl;
sort(idx,idx+k,cmp_y);
for(int i=0;i<k;++i)
{
for(int j=1;j<6;j++)
{
if(i+j < k)
{
ret = min(ret,dst(p[idx[i]],p[idx[i+j]]));
}
}
}
return ret;
}
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_x);
printf("%.2f\n",divide(0,n)/2);
}
// system("pause");
return 0;
}
最近点对
最新推荐文章于 2023-07-08 14:04:50 发布