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的下标记录在a 51 if( (point[mid].x-point[mid-i].x)<=closest ) 52 a[j++]=mid-i; 53 else 54 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 else 60 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了。呵呵
时间: 2024-10-24 05:54:50