真令人头大,按照这个博客的代码写的https://blog.csdn.net/wr_technology/article/details/51057937

一直超时。

最后发现不能用cin,原因如下:

scanf是格式化输入,printf是格式化输出。
cin是输入流,cout是输出流。效率稍低,但书写简便。

效率低的原因可以自行百度。

数据量大的题目最好一开始就用scanf,printf写,不要等超时了再回来改。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <string>
 5 #include <algorithm>
 6 #include <stdlib.h>
 7 #include <cmath>
 8
 9
10
11 using namespace std;
12
13 const int MAXN = 100005;
14 const double INF=1e20;
15 struct Point{
16     double x;
17     double y;
18 };
19 Point point[MAXN];
20 int index[MAXN];
21 double dis(Point a,Point b){
22
23     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
24 }
25 bool cmpx(Point x,Point y){
26     return x.x<y.x;
27 }
28 bool cmpy(int a,int b){
29     return point[a].y<point[b].y;
30 }
31
32 double closest_point(int s,int e){
33     double d=INF;    if(s==e) return d;
34 else if(s+1==e) return dis(point[s],point[e]);
35
36     int mid = (s+e)>>1;//相当于(s+e)/2
37     d = min(closest_point(s,mid),closest_point(mid+1,e));
38     //递归分解问题,找到子区域中的最近点距离
39      /***********找到后,以他们的最近距离来分割区间***********/
40     int i,j,cut = 0;
41     for(i=s;i<=e;i++){
42         if(fabs(point[i].x-point[mid].x)<d)//abs()函数主要是对int求绝对值
43             index[cut++]=i;                  //fabs()对float,double求绝对值
44     }
45     //在区间里找x宽度小于最近距离的把他的下标存在index数组里面
46     sort(index,index+cut,cmpy);
47     for(i=0; i<cut; i++){
48         for(j=i+1; j<cut; j++){
49             if(fabs(point[index[i]].y-point[index[j]].y)>=d)
50                 break;
51             //sort之后,只要当前超过了了,后面的数字一点不可能比这个小,所以不找,省时间
52             d=min(dis(point[index[i]],point[index[j]]),d);
53         }
54     }
55     return d;
56 }
57
58 int main(){
59     int n;
60     while(scanf("%d",&n)!=EOF&&n){
61         int i;
62         for(i=0;i<n;i++)
63         //    cin>>point[i].x>>point[i].y;
64           scanf("%lf %lf",&point[i].x,&point[i].y);
65         sort(point,point+n,cmpx);
66         printf("%.2lf\n",closest_point(0,n-1)/2);
67         //cout<<setiosflags(ios::fixed)<<setprecision(2)<<getMin(0,n-1)/2<<endl;
68     }
69 } 
01-15 16:15