hdu 1007 (空间最近点对)

来源:互联网 发布:hadoop编译java文件 编辑:程序博客网 时间:2024/05/16 10:19

点击打开链接


现学现卖

推荐大神博客,讲的很好啊!:寻找最近点对


#include"stdio.h"#include"string.h"#include"math.h"#include"algorithm"#define N 100111using namespace std;struct node{double x,y;}A[N];int n;int temp[N]; bool cmpx(const node &p1,const node &p2){if(p1.x!=p2.x)return p1.x<p2.x;else return p1.y<p2.y;}bool cmpy(const int &a,const int &b){return A[a].y<A[b].y;}double dist(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 solve(int l,int r){if(l==r)return 1000000000;if(l==r-1)return dist(A[l],A[r]);int i,j,k=0,mid;mid=(l+r)/2;double ans=min(solve(l,mid),solve(mid+1,r));//分离出宽度为ans的区间for(i=l;i<=r;i++){if(fabs(A[mid].x-A[i].x)<=ans)temp[k++]=i;}sort(temp,temp+k,cmpy);//线性搜索for(i=0;i<k;i++){for(j=i+1;j<k&&A[temp[j]].y-A[temp[i]].y<ans;j++)ans=min(ans,dist(A[temp[i]],A[temp[j]]));}return ans;}int main(){int i;while(scanf("%d",&n)!=-1&&n){for(i=0;i<n;i++)scanf("%lf%lf",&A[i].x,&A[i].y);sort(A,A+n,cmpx);double ans=solve(0,n-1);printf("%.2f\n",ans/2);}return 0;}


原创粉丝点击