码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-02 19:32:55      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   for   sp   

 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了。呵呵

 

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

标签:style   blog   http   io   color   ar   os   for   sp   

原文地址:http://www.cnblogs.com/xcw0754/p/4069750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!