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 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...
随机推荐
- 学习总结:斯特林数( Stirling number )
基本定义 第一类斯特林数:$1 \dots n$的排列中恰好有$k$个环的个数:或是,$n$元置换可分解为$k$个独立的轮换的个数.记作 $$ \begin{bmatrix} n \\ k \end{ ...
- 2014 ACM广东省赛总结
2014年广东省赛在化工大学城开,5月10日开幕式&热身赛,5月11日正式赛. 热身赛的时候,开幕式说有两小时,于是我们愉快的切题了,像平常组队赛那样很快出了两题,但卡在后面两题切不动了.这时 ...
- adt eclipse 配置问题 error:could not open ...jvm.cfg
在安装adt eclipse后,打开eclipse提示error:could not open eclipse\jre\lib\amd64\jvm.cfg 据网上显示原因应该是以前安装过java,然后 ...
- storm事件管理器EventManager源码分析-event.clj
storm事件管理器定义在event.clj中,主要功能就是通过独立线程执行"事件处理函数".我们可以将"事件处理函数"添加到EventManager的阻塞队列 ...
- c# sleep 例子-线程挂起
using System; using System.Threading; public class arr { public static void Main() { //int[] arr; // ...
- ZOJ 1586 QS Network Kruskal求最小生成树
QS Network Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the ...
- 如何获取AppStore上应用的ipa安装包
1.首先你得去下载一个Apple Configurator 2,我们通过这个工具来获取ipa包,从AppStore上下载安装你需要获取的App 2.连接手机,打开Apple Configurator ...
- 在SQL中直接把查询结果转换为JSON数据
下面这篇中,已经有准备一些数据: <MS SQL server对象类型type>https://www.cnblogs.com/insus/p/10903916.html 为前端服务,直接 ...
- js 正则表达式学习笔记
正则表达式正则表达式是由一个字符序列形成的搜索模型 语法new RegExp("[abc]")/[abc]//正则表达式主体/修饰符(可选) 1.修饰符i 忽略大小写g 执行全局匹 ...
- Spring Boot Dubbo 构建分布式服务
概述: 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数 ...