10245 - The Closest Pair ----------水题--二分

来源:互联网 发布:好吃小零食知乎 编辑:程序博客网 时间:2024/05/16 07:48
#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define inf 0x7fffffff#define N 10001#define MIN 1e-11#define M 10000#define LL long longusing namespace std;int n,t,k;struct point{    double x,y;};point p[N];int cmp(const void *a,const void *b)//{    return (*(point*)a).x-(*(point*)b).x;}double chang(point p1,point p2){    return sqrt((p1.y-p2.y)*(p1.y-p2.y)+(p1.x-p2.x)*(p1.x-p2.x));}double f(point p[],int l,int r){    if(r==l)        return M;    if(r-l==1)    {        return chang(p[l],p[r]);    }    int mid=(l+r)>>1;    double minv=min(f(p,l,mid),f(p,mid+1,r));    int fl,fr;    int flag=0;    for(int i=l; i<=mid; i++)        if(p[i].x+minv>p[mid].x)        {            flag=1;            fl=i;            break;        }//flag一定等于1//    if(!flag)//    return minv;    flag=0;    for(int i=r; i>mid; i--)        if(p[i].x-minv<p[mid].x)        {            flag=1;            fr=i;            break;        }    if(!flag)    return minv;    for(int i=fl; i<=mid; i++)    {        for(int j=mid+1; j<=fr; j++)        {            double d=chang(p[i],p[j]);            if(d<minv)                minv=d;        }    }    return minv;}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    while(scanf("%d",&n)&&n)    {        for(int i=0; i<n; ++i)            scanf("%lf%lf",&p[i].x,&p[i].y);        qsort(p,n,sizeof(p[0]),cmp);//        for(int i=0;i<n;++i)//        printf("%lf   %lf\n",p[i].x,p[i].y);        double length=f(p,0,n-1);        if(length>=M)            printf("INFINITY\n");        else            printf("%.4lf\n",length);    }    return 0;}

原创粉丝点击