HDU1007Quoit Design(最小点对)

来源:互联网 发布:角色三维动画软件 编辑:程序博客网 时间:2024/05/17 02:23

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007

求所有点中最近两点的距离的一半;最小点对(nlog (n))算法模板题目;

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn = 100001;struct point{    double x,y;}p[maxn],*a[maxn],*b[maxn];bool cmpx (point *A,point *B){    if(A->x==B->x)        return A->y<B->y;    return A->x<B->x;}bool cmpy (point *A,point *B){    if(A->y==B->y)        return A->x<B->x;    return A->y<B->y;}inline double dis(point *a,point *b){    return  sqrt((a->x-b->x)*(a->x-b->x)+(a->y-b->y)*(a->y-b->y));}inline double min(double a,double b){    return a < b ? a : b;}double solve(int l,int r){    if(l+1==r) return dis(a[l],a[r]);    if(l+1==r) return min(dis(a[l],a[r]),min(dis(a[l],a[l+1]),dis(a[l+1],a[r])));    int mid=(l+r)>>1;    double ans=min(solve(l,mid),solve(mid,r));    int i,j,cnt=0;    for(int i=l;i<=r;i++){        if(a[i]->x>=a[mid]->x-ans&&a[i]->x<=a[mid]->x+ans)            b[cnt++]=a[i];    }    sort(b,b+cnt,cmpy);    for(int i=0;i<cnt;i++){        for(int j=i+1;j<cnt;j++){            if(b[j]->y-b[i]->y>=ans)                break;            ans=min(ans,dis(b[i],b[j]));        }    }    return ans;}int main(){    int n;    while(~scanf("%d",&n)&&n!=0){        for(int i=0;i<n;i++){            scanf("%lf%lf",&p[i].x,&p[i].y);            a[i]=&p[i];        }        sort(a,a+n,cmpx);        printf("%.2lf\n",solve(0,n-1)/2);    }    return 0;}


0 0
原创粉丝点击