先是TLE了好久,又是WA了好多。。。看别人的代码终于A了,记录一下~~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
#define N 100010
#define eps (1e-8)
#define INF 99999999
using namespace std;
struct point
{
double x;
double y;
}s[N],p1[N];
int n;
bool cmpx(point a,point b)
{
return a.x<b.x;
}
bool cmpy(point a,point b)
{
return a.y<b.y;
}
double dl(point a,point b)
{
double x=a.x-b.x;
double y=a.y-b.y;
return sqrt(x*x+y*y);
}
double mins(int a,int b)
{
if(a>=b) return INF;
if(a+1==b) return dl(s[a],s[b]);
int mid=(a+b)/2;
double mina=min(mins(a,mid),mins(mid+1,b));
int i,j,k=0;
double m=s[mid].x;
for(i=a;i<=b;i++)
if(fabs(s[i].x-m)<mina+eps)
p1[k++]=s[i];
sort(p1,p1+k,cmpy);
for(i=0;i<k;i++)
for(j=i+1;j<k;j++)
{
if(dl(p1[i],p1[j])>mina-eps)
break;
else
mina=min(mina,dl(p1[i],p1[j]));
}
return mina;
}
int main()
{
while(scanf("%d",&n),n)
{
int i;
for(i=0;i<n;i++)
scanf("%lf %lf",&s[i].x,&s[i].y);
sort(s,s+n,cmpx);
double mina=mins(0,n-1);
printf("%.2lf\n",mina/2);
}
return 0;
}