HDU 1007 Quoit Design最近点对( 分治法)
题意:
给出平面上的n个点,问任意点对之间的最短距离是多少?
思路:
先将所有点按照x坐标排序,用二分法将n个点一分为二个部分,递归下去直到剩下两或一个点。对于一个部分,左右部分的答案分别都知道,那么可能的答案就是min(left_ans,right_ans) 。注意更小的点对可能一个在左,一个在右。所以还得处理两个边内的紧靠着的部分,如果左边的一个点到达中线的距离已经超过当前最短距离,那么这个点到达右边任意一个点也不会是最短距离了。同时,若一左一右的两个点的y距离已经超过目前最短距离,那么也不可能是最短距离,可能为答案的点对并不太多,大概O(n)对。因此,还得在x距离满足的情况下,y也得满足,所以y也得排序。
- #include <bits/stdc++.h>
- using namespace std;
- struct node
- {
- double x,y;
- }a[];
- int c[];
- double cmpy(int t1,int t2) { return a[t1].y<a[t2].y;}
- bool cmp(node t1,node t2) { return t1.x<t2.x; }
- double dis(node t1,node t2) {return sqrt((t1.x-t2.x)*(t1.x-t2.x)+(t1.y-t2.y)*(t1.y-t2.y));}
- double find(int left,int right)
- {
- if(left+==right) return dis(a[left],a[right]);
- if(left==right) return 2147483.999;
- int mid=(left+right)>>;
- double aa=find(left,mid);
- double bb=find(mid+,right);
- double ans=min(aa,bb); //当前最小
- int cnt=;
- double x=a[mid].x;
- for(int i=left; i<=right; i++)
- if(fabs(a[i].x-x)<ans) c[cnt++]=i;
- sort(c,c+cnt,cmpy); //按y来排序
- for(int i=;i<cnt;i++) //计算x=[mid-ans,mid+ans]
- for(int j=i+;j<cnt;j++)
- {
- if(a[c[j]].y-a[c[i]].y>ans) break; //两点的距离已超过ans
- ans=min(ans,dis(a[c[i]],a[c[j]])); //求最小距离
- }
- return ans;
- }
- int main()
- {
- int n,i;
- while(cin>>n,n)
- {
- for(i=;i<n;i++)
- scanf("%lf%lf",&a[i].x,&a[i].y);
- sort(a,a+n,cmp); //按X排序
- printf("%.2lf\n",find(,n-)/);
- }
- return ;
- }
AC代码
HDU 1007 Quoit Design最近点对( 分治法)的更多相关文章
- hdu 1007 Quoit Design (最近点对问题)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1007 Quoit Design(经典最近点对问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
- hdu 1007 Quoit Design 分治求最近点对
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1007 Quoit Design(计算几何の最近点对)
Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...
- HDU 1007 Quoit Design【计算几何/分治/最近点对】
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1007 Quoit Design(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 杭电OJ——1007 Quoit Design(最近点对问题)
Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in whic ...
- hdu 1007 Quoit Design(分治法求最近点对)
大致题意:给N个点,求最近点对的距离 d :输出:r = d/2. // Time 2093 ms; Memory 1812 K #include<iostream> #include&l ...
- HDU 1007 Quoit Design 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...
随机推荐
- Linux命令总结_sort排序命令
1.sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内容,以行为单位 ...
- [hiho1586]Minimum
题意:区间内乘积最小值,带修改.解题关键:线段树裸题,考场上以为x y必须不等,还维护了次小值,尼玛嗨尼玛嗨,划水一整场,心态爆炸. 注意坐标需要+1 #include<cstdio> # ...
- react中创建组件以及使用
组件基本使用import React, { Component } from 'react'; // 在组件头部引用 class Home extends Component { // 创建类 ren ...
- Git 分支管理 创建与合并分支
分支在实际中有什么用呢? 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了. 如果等代码全部写完再一次提交, ...
- underscore.js and moment.js
underscore.js and moment.js underscore.js 一.简介Underscore.js是一个JavaScript实用库,提供了一整套函数式编程的实用功能.它提供了100 ...
- unite2017《Unity企业级支持案例与分析》
在今天举办的Unite2017开发者大会上,Unity大中华区技术支持总监张黎明以"Unity企业级支持案例与分析"为主题进行了分享. 以下为演讲实录: 张黎明:非常感谢大家来参加 ...
- Solr6.7 学习笔记(01) -- 目录结构
Solr解压后的目录结构 --contrib: Solr的一些扩展 --analysis-extras: 包含一些文本分析组件及其依赖 --clustering: 包含一个用于集群搜索结果的引擎 -- ...
- codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】
先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca # ...
- Node.js 内置模块crypto加密模块(3) HMAC
HMAC:哈希消息认证码 ( Hash-based Message Authentication Code ) HMAC是密钥相关的哈希算法 使用 HMAC 进行加密的Node实现的一种方法: &qu ...
- PHP闭包和匿名函数
概念 闭包和匿名函数在PHP5.3.0中被引入. 闭包 闭包是指创建时封装周围环境的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.这个概念很难理解,不过没关系,继续看下去就会明白了. 匿 ...