hdu 1007

liuyan20050516 2011-03-14 11:04:38
#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX=100010;

struct Point
{
double x;
double y;
};

Point px[MAX],py[MAX];
inline double ds(const Point & p1,const Point &p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}



inline bool cmpx(const Point & p1,const Point &p2)
{
return p1.x<p2.x;
}

inline bool cmpy(const Point & p1,const Point &p2)
{
return p1.y<p2.y;
}

double closest(int l,int r)
{
double ans;
if(l+1==r) return ds(px[l],px[r]);
if(l+2==r) return min( ds(px[l],px[r]),min(ds(px[l+1],px[r]),ds(px[l+1],px[l])) );

int m=(l+r)/2;
ans=min(closest(l,m),closest(m+1,r));


int cnt=0;
for(int i=l;i<=r;i++)
if(px[i].x>=px[m].x-ans&&px[i].x<=px[m].x+ans)
py[cnt++]=px[i];

sort(py,py+cnt,cmpy);

for(int j=0;j<cnt;j++)
for(int k=j+1;k<cnt;k++)
{
if(py[j].y-py[k].y>=ans) break;
ans=min(ans,ds(py[j],py[k]));
}
return ans;
}
int main(int argc,char **argv)
{

long n;
while(scanf("%ld",&n),n)
{

for(int i=0;i<n;i++)
scanf("%lf%lf",&px[i].x,&px[i].y);
sort(px,px+n,cmpx);
bool flag=false;

for(int j=0;j<n-1;j++)
if(px[j].x==px[j+1].x&&px[j].y==px[j+1].y)
{
printf("0.00\n");
flag=true;
}
if(!flag)
{
double ans=closest(0,n-1);
printf("%.2f\n",ans/2.0);
}

}
return 0;
}

最近点对问题,想请教下大牛,帮我看看程序效率太低了吗?谢谢,呵呵
...全文
157 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小迷 2012-02-14
  • 打赏
  • 举报
回复
代码最复杂的地方:

for(int j=0;j<cnt;j++)
for(int k=j+1;k<cnt;k++)
{
if(py[j].y-py[k].y>=ans) break;
ans=min(ans,ds(py[j],py[k]));
}

时间复杂度为: O(n^2)
还行

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧