最近对问题,即从一堆点中,找出离得最近的两个点之间的距离
2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
<span style="font-family:Courier New;">#include <cstdio> #include <cmath> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=100000+5; const int INF=1<<31-1; struct Point { double x,y; }; Point p[maxn]; Point pt[maxn]; bool cmp(Point &p1,Point &p2) { return p1.x<p2.x; } bool cmp2(Point &p1,Point &p2) { return p1.y<p2.y; } double getDis(Point &p1,Point &p2) { return sqrt( pow(p1.x-p2.x,2) + pow(p1.y-p2.y,2) ); } double getClosest(int left,int right) { if(left==right) return INF; if(right-left==1) return getDis(p[left],p[right]); int mid=(left+right)/2; double d1=getClosest(left,mid); double d2=getClosest(mid+1,right); double d=(d1<d2?d1:d2); int index=0; for(int i=mid;i>=left;i--) { if(p[mid].x-p[i].x>d) break; else pt[index++]=p[i]; } for(int i=mid+1;i<=right;i++) { if(p[i].x-p[mid].x>d) break; else pt[index++]=p[i]; } sort(pt,pt+index,cmp2); //这里一定要排序,排序后,按照鸽笼原理,dis最多更新8次,可减少计算 for(int i=0;i<index-1;i++) { for(int j=i+1;j<index;j++) { if(pt[j].y-pt[i].y>d) break; else { double dis=getDis(pt[i],pt[j]); if(dis<d) d=dis; } } } return d; } int main() { int n; while(scanf("%d",&n)!=EOF && n) { for(int i=0;i<n;i++) { scanf("%lf%lf",&p[i].x,&p[i].y); } sort(p,p+n,cmp); double ans=getClosest(0,n-1); printf("%.2lf\n",ans/2); } return 0; }</span>