首页 > 代码库 > HDU 1001(TLE代码)★留着待修改★

HDU 1001(TLE代码)★留着待修改★

 1 #include <stdio.h> 2 #include <math.h> 3 struct node{ 4     double x,y; 5 }point[100000]; 6 struct node nod; 7 int n=0,i=0; 8 int sort(void){        //选择排序:从小到大 9     int j,k;10     for(i=0;i<n;i++){11         nod.x=point[i].x;12         nod.y=point[i].y;13         k=i;14         for(j=i+1;j<n;j++){15             if(nod.x>point[j].x){16                 nod.x=point[j].x;17                 nod.y=point[j].y;18                 k=j;19                 }20         }21         if(k!=i){22             point[k].x=point[i].x;23             point[k].y=point[i].y;24             point[i].x=nod.x;25             point[i].y=nod.y;26         }27     }28     return 0;29 }30 double distance(int num1,int num2){  //求两点间的距离31     return sqrt( (point[num2].x-point[num1].x)*(point[num2].x-point[num1].x)+(point[num2].y-point[num1].y)*(point[num2].y-point[num1].y) );32 }33 double min(double left,double right){34     return left<=right?left:right;35 }36 double close(int s,int e){//找出最近的两段距离37     double closest=0.0,left=0.0,right=0.0;38     int mid=0,i,j,k,t;39     int a[50000]={0},b[50000]={0};40     mid=(s+e)>>1;41     if(s+1==e)42         return distance(s,e);43     if(s==e)44         return 1.7976931348623158e+308;45 46     left=close(s,mid);47     right=close(mid+1,e);48     closest=min(left,right);49 50     for( i=1,j=0;i<mid;i++ ){  //把mid轴以左的所有距离小于closest的下标记录在a51         if( (point[mid].x-point[mid-i].x)<=closest )52             a[j++]=mid-i;53         else54             break;55     }56     for( i=1,k=0;i<(n-mid-1);i++ ){57         if( (point[mid+i].x-point[mid].x)<=closest )58             b[k++]=mid+i;59         else60             break;61     }62     //将a中的与b逐个找最小距离63     for(i=0;i<j;i++){64         for(t=0;t<k;t++){65             if(closest>distance(a[i],b[t])){66                 closest=distance(a[i],b[t]);67             }68         }        69     }70     return closest;71 }72 int main()73 {74     int s=0,e=0;75     double tar=0.0;76     while(scanf("%d",&n)!=EOF&&n!=0){77         for(i=0;i<n;i++){            //输入所有坐标点78             scanf("%lf %lf",&point[i].x,&point[i].y);79         }80         s=0;81         e=n-1;82         sort();//排序83         tar=close(s,e);//找出最短距离84         if(tar<0.000001)85             printf("0.00\n");86         else{87             tar=tar/2;88             printf("%.2f\n",tar);89         }90     }91     return 0;92 }

具体思想及做法参照此文  http://blog.csdn.net/sun1956/article/details/8294048

以上代码是根据此文的讲解做出来的,与原文会有很多不同。

PO上HDU之后一直出问题,修改了5个小时,现在还是处于TLE中,对于题目给的3个数据算出来了。

麻烦看到的同学帮我看下问题出在哪,我不能再在此题浪费时间了,以后再来看也许一下就看出bug了。呵呵

 

HDU 1001(TLE代码)★留着待修改★