acm 1007 Quoit Design

来源:互联网 发布:杜兰特总决赛数据效率 编辑:程序博客网 时间:2024/06/07 10:34

这道题用到分治,以前只在数据结构上学到过,今天终于给碰上了。
一开始我用暴力,结果当然是超时。看了别人的代码,是用分治做的,我还是写不来,接着我就边理解边敲。里面还是有一些小细节要注意的。
1.注意循环的范围
2.注意优化
3.多用库函数

#include<iostream>#include<algorithm>#include<cmath>using namespace std;double t;struct point{    double x,y;}p[100001];double power(double x){    return x*x;}bool fun(point p1,point p2){    if(p1.x<p2.x)        return true;    else if(p1.x==p2.x&&p1.y<p2.y)        return true;    else        return false;}double min(double a,double b){    return a<b?a:b;}double dis(point p1,point p2){    return power(p1.x-p2.x)+power(p1.y-p2.y);}void mind(int l,int r){    if(l+5>=r){        for(int i=l;i<=r;i++){            for(int j=i+1;j<=r;j++){            //  printf("%lf\n",dis(p[i],p[j]));                t=min(t,dis(p[i],p[j]));            }        }        return;     }    int mid=(l+r)/2;    mind(l,mid);    mind(mid+1,r);    for(int i=l;i<=mid;i++){        for(int j=mid+1;j<=r;j++){            double d=dis(p[i],p[j]);            if(d>t)                break;            t=d;        }    }    return;}int main(){    int n,i;    while(scanf("%d",&n)!=EOF){         t=100000000;        if(n==0)            break;        for( i=0;i<n;i++)            scanf("%lf%lf",&p[i].x,&p[i].y);        sort(p,p+n,fun);        mind(0,n-1);        t=sqrt(t);        printf("%.2lf\n",t/2);      }    return 0;}
原创粉丝点击