真令人头大,按照这个博客的代码写的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 }