这道题用到分治,以前只在数据结构上学到过,今天终于给碰上了。
一开始我用暴力,结果当然是超时。看了别人的代码,是用分治做的,我还是写不来,接着我就边理解边敲。里面还是有一些小细节要注意的。
1.注意循环的范围
2.注意优化
3.多用库函数
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
double t;
struct point{
double x,y;
}p[100001];
double power(double x){
return x*x;
}
bool fun(point p1,point p2){
if(p1.x<p2.x)
return true;
else if(p1.x==p2.x&&p1.y<p2.y)
return true;
else
return false;
}
double min(double a,double b){
return a<b?a:b;
}
double dis(point p1,point p2){
return power(p1.x-p2.x)+power(p1.y-p2.y);
}
void mind(int l,int r){
if(l+5>=r){
for(int i=l;i<=r;i++){
for(int j=i+1;j<=r;j++){
// printf("%lf\n",dis(p[i],p[j]));
t=min(t,dis(p[i],p[j]));
}
}
return;
}
int mid=(l+r)/2;
mind(l,mid);
mind(mid+1,r);
for(int i=l;i<=mid;i++){
for(int j=mid+1;j<=r;j++){
double d=dis(p[i],p[j]);
if(d>t)
break;
t=d;
}
}
return;
}
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
t=100000000;
if(n==0)
break;
for( i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p,p+n,fun);
mind(0,n-1);
t=sqrt(t);
printf("%.2lf\n",t/2);
}
return 0;
}