#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define max 100020
struct point
{
double x,y;
}num[max],ans[max];
bool cmpx(point a,point b){ return a.x<b.x;}
bool compare(point a,point b){return a.y<b.y;}
double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double MIN(double a,double b){return (a<b?a:b);}
double choose(int lower ,int high)
{
if(lower+1==high)
return dis(num[lower],num[high]);
else if(lower+2==high)
return MIN(dis(num[lower],num[lower+1]),MIN(dis(num[lower],num[high]),dis(num[lower+1],num[high])));
int mid,i,j,m=0;
double min;
mid=(lower+high)/2;
min=MIN(choose(lower,mid),choose(mid+1,high));
for(i=lower;i<=high;i++){
if(fabs(num[i].x-num[mid].x)<=min)
ans[m++]=num[i];
}
sort(ans,ans+m,compare);
for(i=0;i<m;i++){
for(j=i+1;j<m;j++){
if(ans[j].y-ans[i].y>=min)
break;
min=MIN(min,dis(ans[i],ans[j]));
}
}
return min;
}
int main()
{
int n,i;
double min;
while(scanf("%d",&n) , n){
for(i=0;i<n;i++)
scanf("%lf%lf",&num[i].x,&num[i].y);
sort(num,num+n,cmpx);
min=choose(0,n-1);
printf("%.2lf\n",min/2);
}
return 0;
}
hdu1007 Quoit Design 分治 差点吐血 中间出了点小错,多交了N次
最新推荐文章于 2021-03-22 19:15:38 发布