博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
平面最近点对
阅读量:4332 次
发布时间:2019-06-06

本文共 1071 字,大约阅读时间需要 3 分钟。

分治例题

个人理解:先排序,然后将\(n\)个点均分成左右两部分,分别求出左边点之间的最近距离\(d1\),和右边点的最近距离\(d2\),取\(d=min(d1,d2)\)。然后考虑最近点队的两个点分属于两边的情况,肯定只可能是很靠近中间线的那几个点(题解里证明不超过六个)。加个剪枝优化,横坐标距离\(s[mid].x\)(中点线)大于\(d\)的肯定不行。将所有据中点线距离不超过\(d\)的点取出,按\(y\) 值排个序,对于每一个点,只需要考虑它后面(下面)的\(y\) 值据它不超过 \(d\) 的点,超过就可以\(break\)(因为排好序了嘛)。

代码时间:

#include
#include
#include
#include
#include
using namespace std;const int N = 1000005;const int inf = 2<<20;int n,temp[N];struct point{ double x,y;}s[N];bool cmp(point a,point b){ if(a.x==b.x) return a.y
>1; double d1=merge(left,mid); double d2=merge(mid+1,right); d=min(d1,d2); int k=0; for(int i=left;i<=right;i++) if(fabs(s[mid].x-s[i].x)<=d) temp[++k]=i; sort(temp+1,temp+k+1,cmps); for(int i=1;i<=k;i++) for(int j=i+1;j<=k&&s[temp[j]].y-s[temp[i]].y
d3) d=d3; } return d;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&s[i].x,&s[i].y); sort(s+1,s+n+1,cmp); printf("%.4lf\n",merge(1,n)); return 0;}

转载于:https://www.cnblogs.com/karryW/p/11222195.html

你可能感兴趣的文章
H5 表单标签
查看>>
su 与 su - 区别
查看>>
C语言编程-9_4 字符统计
查看>>
在webconfig中写好连接后,在程序中如何调用?
查看>>
限制用户不能删除SharePoint列表中的条目(项目)
查看>>
【Linux网络编程】使用GDB调试程序
查看>>
feign调用spring clound eureka 注册中心服务
查看>>
ZT:Linux上安装JDK,最准确
查看>>
LimeJS指南3
查看>>
关于C++ const成员的一些细节
查看>>
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>
微信测试账户
查看>>
Android ListView上拉获取下一页
查看>>
算法练习题
查看>>
学习使用Django一 安装虚拟环境
查看>>
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>