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
" ,sqrt(min)/2);
   }
   return 0;
}
      
      
      
      

原文地址:https://www.cnblogs.com/csnd/p/12063133.html