您的位置:首页 > 其它

1007(分治法,快速排序,但还是时间超限)

2017-03-20 15:40 211 查看
#include <iostream>
#include<cstdio>
#include <iomanip>
#include <cmath>
#include <algorithm>
using namespace std;
struct Point
{
float x,y;
bool operator <(const struct Point &t)
{
if(x==t.x)
return y<t.y;
return x<t.x;
}
bool operator >(const struct Point &t)
{
if(x==t.x)
return y>t.y;
return x>t.x;
}
} X[100001],Y[100001],Z[100001];
float pointDistance( Point m, Point n);
float minDistance(int s,int e);
void quickSort(int b,int e);
int partSort(int bb,int ee);
int main()
{
int N;
while(cin>>N&&N!=0&&N>=2&&N<=100000)
{
float d;
for(int i=0; i<N; i++)
cin>>X[i].x>>X[i].y;
quickSort(0,N-1);
d=minDistance(0,N-1);
float minRadius=d/2;
cout<<fixed<<setprecision(2)<<minRadius<<endl;
}
return 0;
}
float minDistance(int s,int e)
{
float dd;
if(e==s)
return 0;
else if(e-s==1)
{
dd=pointDistance(X[e],X[s]);
return dd;
}
else if(e-s==2)
{
float d1=pointDistance(X[s],X[e]);
float d2=pointDistance(X[s+1],X[e]);
float d3=pointDistance(X[s],X[s+1]);
dd= min(min(d1,d2),d3);
return dd;
}
else
{
int mid=(s+e)/2;
dd=min(minDistance(s,mid),minDistance(mid+1,e)) ;
int k=0;
for(int i=s; i<e; i++)
if(fabs(X[i].x-X[mid].x)<dd)
Z[k++]=X[i];
int l=k;
k=0;
mid=l/2;
for(int i=0; i<l; i++)
if(fabs(Z[i].y-Z[mid].y)<dd)
Y[k++]=Z[i];
for(int i=0; i<k-1; i++)
for(int j=i+1; j<k; j++)
dd=min(dd,pointDistance(Y[i],Y[j]));
return dd;
}
}
float pointDistance(Point m, Point n)
{
float dx=m.x-n.x;
float dy=m.y-n.y;
return sqrt(dx*dx+dy*dy);
}
void quickSort(int b,int e)
{
if(b<e)
{
int q=partSort(b,e);
quickSort(b,q-1);
quickSort(q+1,e);
}
}
int partSort(int bb,int ee)
{
int i=bb,j=ee+1;;
Point temp,t=X[bb];
while(true)
{
while(X[++i]<t&&i<ee);
while(X[--j]>t);
if(i>=j)
break;
temp=X[i];
X[i]=X[j];
X[j]=temp;
}
X[bb]=X[j];
X[j]=t;
return j;
}
弄了一天啊,连午饭都没吃,好不容易理解了个大概,可是还是时间超限,看了网上很多大神的,感觉最大的区别就是,我用的快速排序法,大神们用的algorithm中的sort函数,但是我看解释,两者的算法复杂度是一样的啊,一天啊,一天没弄出来这道题,真是笨啊。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: