0
点赞
收藏
分享

微信扫一扫

hdu1007 最近点对

题意:
      给你n个点,让你求最近的两个点的距离是多少.
思路:

      这个题目我没思路,我在网上看的是什么分治 + 鸽巢原理,分治我知道,鸽巢原理我也知道,但是这个题目就是没有证明出来他和鸽巢原理有jm关系,总之就是先以x或者y优先sort一下,然后每次枚举每个相邻点的附近5个就行了(加自己一共六个),而且这个题目的前提好像还是什么数据必须是随机产生的吧,ac可以,但不明白..



#include<stdio.h>
#include<math.h>
#include<algorithm>

#define N 100000 + 100

using namespace std;

typedef struct
{
double x ,y;
}NODE;

NODE node[N];

bool camp(NODE a ,NODE b)
{
return a.y < b.y || a.y == b.y && a.x < b.x;
}

double dis(NODE a ,NODE b)
{
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

int main ()
{
int n ,i ,j;
while(~scanf("%d" ,&n) && n)
{

for(i = 1 ;i <= n ;i ++)
scanf("%lf %lf" ,&node[i].x ,&node[i].y);
sort(node + 1 ,node + n + 1 ,camp);
double min = 1000000000;
for(i = 1 ;i <= n ;i ++)
for(j = i + 1 ;j <= i + 5 && j <= n ;j ++)
{
double now = dis(node[i] ,node[j]);
if(min > now) min = now;
}
printf("%.2lf\n" ,sqrt(min)/2);
}
return 0;
}




举报

相关推荐

0 条评论