hdu 1007最近点对

来源:互联网 发布:sql查询字段长度限制 编辑:程序博客网 时间:2024/05/22 11:11
#include<cstdio>#include<cstring>#include <cstdlib>#include <algorithm>#include <iostream>#include <cmath>#define M 100010using namespace std;int n;struct point{    double x,y;}p[M];int a[M];double cmp(point aa,point bb){    return aa.x<bb.x;}double cmpy(int a,int b){    return p[a].y<p[b].y;}double dis(point aa,point bb){    return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y));}double find(int l,int r)//分治法{    if(l+1==r)        return dis(p[l],p[r]);    else if(l+2==r)        return min(dis(p[l],p[l+1]),min(dis(p[l],p[r]),dis(p[l+1],p[r])));    int mid=(l+r)>>1;    double ans=min(find(l,mid),find(mid+1,r));//先在左右两个区间求最小值    int cnt=0;//再比较左右各占一个时的情况    for(int i=l; i<=r; i++)        if(p[i].x>=p[mid].x-ans&&p[i].x<=p[mid].x+ans)            a[cnt++]=i;    sort(a,a+cnt,cmpy);    for(int i=0; i<cnt; i++)    {        for(int j=i+1; j<cnt; j++)        {            if(p[a[j]].y-p[a[i]].y>=ans)break;            ans=min(ans,dis(p[a[j]],p[a[i]]));        }    }    return ans;}int main(){    while(scanf("%d",&n)==1&&n)    {        for(int i=0; i<n; i++)            scanf("%lf%lf",&p[i].x,&p[i].y);        sort(p,p+n,cmp);        printf("%.2lf\n",find(0,n-1)/2);    }    return 0;}

0 0
原创粉丝点击