http://acm.hdu.edu.cn/showproblem.php?pid=1007
2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
0.71 0.00 0.75
先说下题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半。
第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标。实数。
#include <iostream> #include <stdio.h> #include <algorithm> #include <cmath> #define MAX 100005 using namespace std; struct node { double x,y; }; node point[MAX],px[MAX],py[MAX]; bool cmpx(node a,node b) { return a.x<b.x; } bool cmpy(node a,node b) { return a.y<b.y; } double d(node a,node 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 closeset(int s,int e) { if(s+1==e)///当只有一条边时 return d(px[s],px[e]); if(s+2==e)///当只有两条边时 return min(d(px[s],px[e]),min(d(px[s+1],px[s]),d(px[s+1],px[e]))); int mid=(s+e)/2; double ans=min(closeset(s,mid),closeset(mid+1,e));///递归求解,一直减小范围 int cnt=0; for(int i=s;i<=e;i++) { if(px[i].x>=px[mid].x-ans&&px[i].x<=px[mid].x+ans) py[cnt++]=px[i]; } sort(py,py+cnt,cmpy); int i,j; for( i=0; i<cnt; i++) { for( j=i+1; j<cnt; j++) { if(py[j].y-py[i].y>=ans) break; ans=min(ans,d(py[i],py[j])); } } return ans; } int main() { int t; while(scanf("%d",&t)!=EOF) { if(t==0) break; for(int i=0; i<t; i++) { scanf("%lf%lf",&point[i].x,&point[i].y); px[i].x=point[i].x; px[i].y=point[i].y; } sort(px,px+t,cmpx); double ans=closeset(0,t-1); printf("%.2lf\n",ans/2.0) ; } return 0; }