题目链接:

http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21269

题意:

求平面最近点对。

分析:

经典问题。

n比较大,直接枚举不可。

与上一道的树分治类似,我们也可以将点按照x坐标分成两类。

假设把所有点按照x坐标分成两类,那么有如下两种情况:

  1. 点p,q同属于左半边
  2. 点p,q一个属于左边一个属于右边

同样,对于第一种情况我们采用递归即可求解。

对于第二种情况,由于已经知道第一种情况下的最小距离d,所以我们只需考虑到划分的直线(x坐标为x0)的距离小于d的点,即坐标满足x0−d<x<x0+d,而对于y坐标,每个点只需考虑y坐标比自己大的,且相差不超过d的点即可。

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<cmath>
  5. #include<cstdio>
  6. using namespace std;
  7. #define x first
  8. #define y second
  9. typedef pair<double, double>p;
  10. const int maxn = 1e4 + 5, oo = 0x3f3f3f3f;
  11. int n;
  12. double eps = 1e-8;
  13. p a[maxn];
  14. bool cmp(p a, p b){return a.y < b.y;}
  15. double solve(p* a, int n)
  16. {
  17. if(n <= 1) return oo;
  18. int m = n / 2;
  19. double xx = a[m].x;
  20. double d = min(solve(a, m), solve(a + m, n - m));
  21. vector<p>b;
  22. for(int i = 0; i < n; i++){
  23. if(fabs(a[i].x - xx) <= d) b.push_back(a[i]);
  24. }
  25. sort(b.begin(), b.end(), cmp);
  26. for(int i = 0; i <b.size(); i++){
  27. for(int j = i + 1; j < b.size(); j++){
  28. double dx = b[j].x - b[i].x;
  29. double dy = b[j].y - b[i].y;
  30. if(dy - d >= eps) break;
  31. d = min(d, sqrt(dx * dx + dy * dy));
  32. }
  33. }
  34. return d;
  35. }
  36. int main (void)
  37. {
  38. while(scanf("%d", &n) && n){
  39. double aa, bb;
  40. for(int i = 0 ; i < n; i++){
  41. scanf("%lf%lf", &aa, &bb);
  42. a[i] = p(aa, bb);
  43. }
  44. sort(a, a + n);
  45. double ans = solve(a, n);
  46. if(ans - 1e4 > eps) printf("INFINITY\n") ;
  47. else printf("%.4f\n", ans);
  48. }
  49. return 0;
  50. }

UVA 10245 The Closest Pair Problem【分治】的更多相关文章

  1. UVa 10245 The Closest Pair Problem (分治)

    题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...

  2. UVA 10245 The Closest Pair Problem 最近点问题 分治算法

    题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...

  3. UVA 10245 - The Closest Pair Problem

    Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...

  4. uva 10245 The Closest Pair Problem_枚举

    题意:求任意两点之间的距离的最少一个距离 思路:枚举一下就可以了 #include <iostream> #include<cstdio> #include<cmath& ...

  5. 2.11 2D平面最近点对问题[closest pair problem]

    [本文链接] http://www.cnblogs.com/hellogiser/p/closest-pair-problem.html [题目] 给定平面上N个点的坐标,找出距离最近的两个点之间的距 ...

  6. uva10245-The Closest Pair Problem(平面上的点分治)

    解析:平面上的点分治,先递归得到左右子区间的最小值d,再处理改区间,肯定不会考虑哪些距离已经大于d的点对,对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,x轴方向只用考虑[x-d,x+d]( ...

  7. Codeforces Round #185 (Div. 2) C. The Closest Pair 构造

    C. The Closest Pair Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/312/p ...

  8. HDU 6697 Closest Pair of Segments (计算几何 暴力)

    2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...

  9. UVa 100 - The 3n + 1 problem(函数循环长度)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

随机推荐

  1. iOS 自己手动添加编译警告

    文/青花瓷的平方(简书作者)原文链接:http://www.jianshu.com/p/b2e30cad2a0d著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 缘由 上一次生产环境我们 ...

  2. SQL Server 2012使用OFFSET/FETCH NEXT分页及性能测试

    最近在网上看到不少文章介绍使用SQL Server 2012的新特性:OFFSET/FETCH NEXT 实现分页.多数文章都是引用或者翻译的这一篇<SQL Server 2012 - Serv ...

  3. Sql Server RowNumber和表变量分页性能优化小计

    直接让代码了,对比看看就了解了 当然,这种情况比较适合提取字段较多的情况,要酌情而定 性能较差的: WITH #temp AS                       (              ...

  4. 关于maven source1.5报错

    是因为maven 默认是1.5编译的 <build>//加上这个配置,把编译给改掉试试 <pluginManagement> <plugins> <plugi ...

  5. COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)

    ★   输入文件:AgeSort.in   输出文件:AgeSort.out   简单对比时间限制:1 s   内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强 ...

  6. eject - 弹出可移动介质

    SYNOPSIS(总览) eject -h.breject [-vnrsfq] [<name>] eject [-vn] -d.breject [-vn] -a on|off|1|0 [& ...

  7. 目录下 shift 右键菜单 打开cmd 或者在 地址栏输入cmd 回车进入cmd

    目录下 shift 右键菜单 打开cmd 或者在 地址栏输入cmd 回车进入cmd

  8. Deep_into_iris

    具体ipynb文件请移步Github #各种所需要的库函数首先加载 import numpy as np import pandas as pd import matplotlib.pyplot as ...

  9. 最短路 || POJ 1847 Tram

    POJ 1847 最短路 每个点都有初始指向,问从起点到终点最少要改变多少次点的指向 *初始指向的那条边长度为0,其他的长度为1,表示要改变一次指向,然后最短路 =========高亮!!!===== ...

  10. win10x64下的redis安装与使用

    先引用百度百科的一段话吧,具体可以到百科查看吧. Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...