整到题的主体算法思想是看了变成之美才写出来的,可以多次提交都没有ac,总是超时,然后去网上查代码,发现用分治和二分法不会超时呀,然后慢慢的检查代码的各个部分,最后发现,在将所有点分为左右两部分的时候,自己写的代码有问题,每次循环都调用了fabs函数,造成额外开销,造成了超时
下面是代码:
#include<iostream>
#include<cmath>
#include<fstream>
#include<algorithm>
const int maxs=100005;
using namespace std;
class point{
public:
double x;
double y;
char index;
};
point points[maxs],pointx[maxs];
bool compx(point a,point b){
if(a.x==b.x){
return a.y<b.y;
}
else
return a.x<b.x;
}
bool compy(point a,point b){
if(a.y==b.y){
return a.x<b.x;
}else
return a.y<b.y;
}
double getdis(point a,point b){
double chax=a.x-b.x;
double chay=a.y-b.y;
return sqrt( chax*chax+chay*chay);
}
double mindis(double a,double b){
if(a<=b)return a;
else return b;
}
double get_distance(int l,int r){
if(l+1==r){
return getdis(points[l],points[r]);
}
else if(l+2==r){
double s1,s2,s3;
s1=getdis(points[l],points[l+1]);
s2=getdis(points[l+1],points[l+2]);
s3=getdis(points[l],points[l+2]);
return mindis(mindis(s1,s2),s3);
}
else {
double leftmin,rightmin;
int mid=(r+l)/2;
int m=0;
leftmin=get_distance(l,mid); rightmin=get_distance(mid+1,r);
double dis=mindis(leftmin,rightmin);
/* for(int i=l;i<=r;++i){//超时
if(fabs(points[i].x-points[mid].x)<=dis){ //每次都要调用fabs,造成了额外的开销,造成超时
if(points[i].x<=points[mid].x){
pointx[m]=points[i];
pointx[m].index='l';
++m;
}else{
pointx[m]=points[i];
pointx[m].index='r';
++m;
}
}
} */
for ( int i = l; i <= mid; i++)
{
double leftCoord = points[mid].x - dis;
if (points[i].x >= leftCoord)
{
pointx[m].index = 'l'; /*标识属于左边部分*/
pointx[m].x = points[i].x;
pointx[m].y = points[i].y;
m++;
}
}
for ( int i=mid+1; i <= r; i++)
{
double rightCoord = points[mid].x + dis;
if (points[i].x <= rightCoord)
{
pointx[m].index = 'r'; /*标识属于右边部分*/
pointx[m].x = points[i].x;
pointx[m].y = points[i].y;
m++;
}
}
sort(pointx,pointx+m,compy);
for(int k=0;k!=m;++k){ //自己写的
if(pointx[k].index=='l'){
for(int n=1;n<=7&&k+n<m;++n){
if(pointx[k+n].index!='r')continue;
double tem=getdis(pointx[k],pointx[k+n]);
if(tem<dis) dis=tem;
}
for(int p=1;p<=7&&k-p>=0;++p){
if(pointx[k-p].index!='r')continue;
double tem=getdis(pointx[k],pointx[k-p]);
if(tem<dis) dis=tem;
}
}
}
return dis;
}
}
int main(){
int n;
while(cin>>n&&n!=0){
for(int i=0;i!=n;++i){
cin>>points[i].x>>points[i].y; }
sort(points,points+n,compx);
double dis;
dis=get_distance(0,n-1);
cout.precision(2);
cout<<fixed<<dis/2<<endl;
}
return 0;
}