hdu 1007
#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX=100010;
struct Point
{
double x;
double y;
};
Point px[MAX],py[MAX];
inline double ds(const Point & p1,const Point &p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
inline bool cmpx(const Point & p1,const Point &p2)
{
return p1.x<p2.x;
}
inline bool cmpy(const Point & p1,const Point &p2)
{
return p1.y<p2.y;
}
double closest(int l,int r)
{
double ans;
if(l+1==r) return ds(px[l],px[r]);
if(l+2==r) return min( ds(px[l],px[r]),min(ds(px[l+1],px[r]),ds(px[l+1],px[l])) );
int m=(l+r)/2;
ans=min(closest(l,m),closest(m+1,r));
int cnt=0;
for(int i=l;i<=r;i++)
if(px[i].x>=px[m].x-ans&&px[i].x<=px[m].x+ans)
py[cnt++]=px[i];
sort(py,py+cnt,cmpy);
for(int j=0;j<cnt;j++)
for(int k=j+1;k<cnt;k++)
{
if(py[j].y-py[k].y>=ans) break;
ans=min(ans,ds(py[j],py[k]));
}
return ans;
}
int main(int argc,char **argv)
{
long n;
while(scanf("%ld",&n),n)
{
for(int i=0;i<n;i++)
scanf("%lf%lf",&px[i].x,&px[i].y);
sort(px,px+n,cmpx);
bool flag=false;
for(int j=0;j<n-1;j++)
if(px[j].x==px[j+1].x&&px[j].y==px[j+1].y)
{
printf("0.00\n");
flag=true;
}
if(!flag)
{
double ans=closest(0,n-1);
printf("%.2f\n",ans/2.0);
}
}
return 0;
}
最近点对问题,想请教下大牛,帮我看看程序效率太低了吗?谢谢,呵呵