/** 用分治法求最近点对问题,时间复杂度为O(n*logn*logn) */  
/** 最近点对问题,时间复杂度为O(n*logn*logn) */  
#include <iostream>
#include <cstdio>  
#include <cstring>  
#include <cmath>  
#include <algorithm>  
using namespace std;  
const double INF = 1e20;  //1e20 = 1^20 = 0.00000000000000000000000000000000000001 指最小的浮点数
const int N = 100005;  
struct Point  
{   double x;     double y;  }point[N];  
int n;  
int tmpt[N];  
bool cmpxy(const Point& a, const Point& b)  
{  
    if(a.x != b.x)  
        return a.x < b.x;  
    return a.y < b.y;  
}

bool cmpy(const int& a, const int& b)  
{  
    return point[a].y < point[b].y;  
}

double min(double a, double b)  
{  
    return a < b ? a : b;  
}

double dis(int i, int j)  //求两点距离
{  
    return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)  
+ (point[i].y-point[j].y)*(point[i].y-point[j].y));  
}

double Closest_Pair(int left, int right)  
{  
    double d = INF;  
    if(left==right)  //如果只有一个点,则最近点对的距离为0
        return d;  
    if(left + 1 == right)  //如果只有两个点,则返回两点之间的距离
        return dis(left, right);  
    int mid = (left+right)>>1;  
    double d1 = Closest_Pair(left,mid);  
    double d2 = Closest_Pair(mid+1,right);  
    d = min(d1,d2);  
    int i,j,k=0;  
    //分离出宽度为d的区间  
    for(i = left; i <= right; i++)  
    {  
        if(fabs(point[mid].x-point[i].x) <= d)     //fabs(float x) 求浮点数的绝对值
            tmpt[k++] = i;  
    }  
    sort(tmpt,tmpt+k,cmpy);  
    //线性扫描  
    for(i = 0; i < k; i++)  
    {  
        for(j = i+1; j < k && point[tmpt[j]].y-point[tmpt[i]].y<d; j++)  
        {  
            double d3 = dis(tmpt[i],tmpt[j]);  
            if(d > d3)  
                d = d3;  
        }  
    }  
    return d;  
}

int main()  
{  
    while(true)  
    {
        scanf("%d",&n);  
        if(n==0)  
            break;  
        for(int i = 0; i < n; i++)  
            scanf("%lf %lf",&point[i].x,&point[i].y);  
        sort(point,point+n,cmpxy);  
        printf("%.2lf\n",Closest_Pair(0,n-1)/2);  
    }
    return 0;  
}

//代码来源连接http://yzmduncan.iteye.com/blog/1432880

求坐标上最近两点的距离

HDOJ 1007 (分治法)相关推荐

  1. 详解分治法(divide-and-conquer)及其典型应用

    什么是分治法 在昨天的文章<漫谈数据库中的join>的最后,提到Grace hash join和Sort-merge join都是基于分治思想的.分治法(divide-and-conque ...

  2. 算法设计思想(4)— 分治法

    1. 分治法概念 分治,顾名思义,分而治之. 具体来说,它先将一个难以直接解决的大问题,分割成一些可以直接解决的小问题.如果分割后的问题仍然无法直接解决,那么就继续递归地分割,直到每个小问题都可解. ...

  3. 动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会

    每次体会算法都有新的感觉,刷题越多,对算法的理解感觉也就越深刻. 下面我们来重新体会下分治法,动态规划,贪心法,递归的理解. 1.分治法: 将问题分成单独的阶段,每个阶段互相不干扰很独立,如10米长的 ...

  4. LeetCode 23. Merge k Sorted Lists--Python解法--优先队列,分治法

    题目地址:Merge k Sorted Lists - LeetCode Merge k sorted linked lists and return it as one sorted list. A ...

  5. Hanoi塔(分治法的应用)

    1.分治法 分治法的设计思想是将一个难以直接解决的大问题分解成一些规模较小的相同问题,以便各个击破,分而治之. 一般来说,分治算法在每一层递归上都有3个步骤: (1)分解:将问题分解成一系列子问题. ...

  6. 从合并排序算法看“分治法”

    本文内容 分治策略 分治步骤 从合并排序看"分治策略" 分治策略 分治法(divide-and-conquer),"分治法策略"是一种很重要的算法.顾名思义,& ...

  7. 2_2 递归与分治策略(分治法的基本思想)

    基本思想:将复杂问题简单化,大事化小,小事化了,很符合中国人的思想. 打官腔:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解, ...

  8. python分治算法_python算法实现-分治法

    分治法概念将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----"分" 将最后子问题可以简单的直接求解----"治" 将所有子问 ...

  9. 分治法解决最大子数组问题

    分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...

最新文章

  1. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...
  2. JS发送跨域Post请求出现两次请求的解决办法
  3. wampserver 绑定域名 外部可以正常访问
  4. Python爬虫开发:requests库的使用--https协议的问题解决
  5. linux局部变量特殊字符替换,变量,全局变量,环境变量,特殊符号、管道符命令:cut、sort、uniq、wc、tee、tr、sp...
  6. python matplotlib数据可视化_Python - matplotlib 数据可视化
  7. 一步一步学Ruby(二):变量,常量
  8. mysql怎么切换用户_DB2迁移到Mysql
  9. [转帖] BMC安全隐患
  10. linux —— ubuntu 初次安装问题
  11. Hbase与传统关系型数据库对比
  12. golang 实现http mock server
  13. android 读取图片字节流,Android屏幕截图直接读取screencap流来实现
  14. MATLAB身份证号码识别系统(GUI论文)
  15. RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
  16. C++ 后端开发工程师的技术栈整理
  17. 国外游戏开发公司10强
  18. android获取SIM卡信息和手机号码
  19. 条件if语句的多种写法
  20. 介绍18650锂离子电池的命名规则

热门文章

  1. Oracle查看表空间大小以及修改表空间大小
  2. 如何从命令行启动 CST 软件?
  3. LSM零知识学习四、插桩原理实现细节(2)
  4. HBase 行键设计
  5. CSDN学霸课表——微信公众号开发全部流程
  6. linux设置程序自动启动
  7. Java 递归遍历文件
  8. qml在部分windows7上文字显示模糊的问题
  9. 竞争压力大,vivo重视中低端手机
  10. WIN10平板如何录制视频,为什么录制屏幕无法播放