您的位置:首页 > 其它

hdu 1007 寻找最近点对

2014-03-16 23:02 232 查看
自己是新手,拿到题目直接两重循环,结果TLE,上网搜索寻找最近点对,发现分治算法,学习了。

#include<cmath>
#include<cstdio>
#include<algorithm>
#define Min(a,b) (a<b?a:b)
using namespace std;
struct Points
{
double x,y;
}a[100005];
int temp[100005];
bool cmpx(const Points a,const Points b)
{
if(a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
bool cmpy(const int& i,const int& j)
{
if(a[i].y == a[j].y) return a[i].x < a[j].x;
return a[i].y < a[j].y;
}
double getdis(int i,int j)
{
double x=a[i].x-a[j].x;
double y=a[i].y-a[j].y;
return sqrt(x*x+y*y);
}
double ClosePoint(int s,int e)
{
if( s >= e ) return 100000000.0;//如果子集为空,返回无穷大
int mid = (s+e)/2,k=0;
double dl = ClosePoint(s,mid);//求左边最近点
double dr = ClosePoint(mid+1,e);//右边
double d = Min(dl,dr),x0 = a[mid].x;
for(int i = s;i <= e;i ++)
if(fabs( x0 - a[i].x )<d)
temp[k++]=i;
sort(temp,temp+k,cmpy);
for(int i=0; i<k ;i++)
for(int j=i+1; j<k && a[temp[j]].y-a[temp[i]].y<d ;j++)//在2d之间的点按y排序后,筛选出两点,其y之差满足小于d
d=Min(d,getdis(temp[i],temp[j]));
return d;
}
int main()
{
int n;
while( ~scanf("%d",&n) && n )
{
for(int i=0;i<n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
sort(a,a+n,cmpx);
double ans=ClosePoint(0,n-1);
printf("%.2lf\n",ans/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: