zoukankan      html  css  js  c++  java
  • 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;
    }
          
          
          
          
    

  • 相关阅读:
    2018全球最强物联网公司榜单揭晓
    物联网
    kalman滤波
    自动驾驶
    CAN总线基础
    Linux系统下x86和ARM的区别有哪些?
    算法课笔记系列(七)—— 平摊分析Amortized Analysis
    深入理解Linux内存分配
    linux内核--自旋锁的理解
    DMA(直接存储器存取)
  • 原文地址:https://www.cnblogs.com/csnd/p/12063133.html
Copyright © 2011-2022 走看看