hdu1007 最近点对

本文探讨了计算平面上最近两点间距离的问题,并采用分治法结合鸽巢原理的方法进行求解。通过先按坐标轴方向排序,再枚举每个点附近的若干点来找到最小距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
      给你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;
}
      
      
      
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值