HDU 1007Quoit Design(最近点问题)
最近点问题:二维平面中有n(n很大)个点,求出距离最近的两个点思路:因为n的值很大,所以暴力和dp都行不通了吧!分治法就挺好的。将区间一半一半的分开,直到分成只有一个点或两个点的时候!对于只有两个点的区间,最小值就是这两个点的距离,只有一个点的区间,最小值就是无穷大。注意还要考虑合并的时候,可能距离最近的两个点,分别在左右两个不同的区间。对于这种情况的处理如下:mid=(ld+rd)/2;ans = min(solve(ld, mid), solve(mid+1, rd));得到两段区间最小值的最小值 从中间向两边寻找,因为我们是按照x坐标排序的,在左区间向左边寻找的时候如果某一个点的x到中间点x的距离大于ans(否则将这样的点保存),那么这个点左边的点就不可能在右区间寻找到相应的点满足两个点的距离小于ans的,那么就结束继续查找(这样算是一种优化) 同理在右区间向右寻找。。。然后对存储的节点按照y坐标进行从小到大的排序。 枚举每两个点寻找最小的距离
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #define MAX 99999999999999.0 7 using namespace std; 8 9 struct node{ 10 double x, y; 11 }nd[100005], ndx[100005]; 12 13 bool cmp(node a, node b){ 14 if(a.x == b.x) return a.y < b.y; 15 return a.x < b.x; 16 } 17 18 bool cmpy(node a, node b){ 19 return a.y < b.y; 20 } 21 22 double dist(node a, node b){ 23 return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); 24 } 25 26 double solve(int ld, int rd){ 27 if(ld == rd) return MAX; 28 if(ld + 1 == rd) return dist(nd[ld], nd[rd]); 29 int mid = (ld+rd)/2; 30 double ans = min(solve(ld, mid), solve(mid+1, rd)); 31 int len = 0; 32 for(int i = mid; i>=ld; --i) 33 if(nd[mid].x - nd[i].x <= ans) 34 ndx[len++] = nd[i]; 35 else break; 36 for(int i=mid+1; i<=rd; ++i) 37 if(nd[i].x - nd[mid].x <= ans) 38 ndx[len++] = nd[i]; 39 else break; 40 41 sort(ndx, ndx+len, cmpy) ; 42 for(int i=0; i<len-1; ++i) 43 for(int j=i+1; j<len; ++j) 44 if(ndx[j].y - ndx[i].y >= ans) break;//这里做一处优化 45 else ans = min(ans, dist(ndx[i], ndx[j])); 46 return ans; 47 } 48 49 int main(){ 50 int n; 51 while(scanf("%d", &n) && n){ 52 for(int i=0; i<n; ++i) 53 scanf("%lf%lf", &nd[i].x, &nd[i].y); 54 sort(nd, nd+n, cmp); 55 printf("%.2lf\n", solve(0, n-1)/2.0); 56 } 57 return 0; 58 }
转载于:https://www.cnblogs.com/hujunzheng/p/4348418.html
HDU 1007Quoit Design(最近点问题)相关推荐
- hdu_1007_Quoit Design(最近点对)
题目连接:hdu_1007_Quoit Design 题意: 给你平面上的一些点,让你找出这些点的最近点对的距离 题解: 采用分治,达到O(nlognlogn)的时间复杂度就能艹过去了 1 #incl ...
- 杭电OJ分类题目(2)
原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(2) HDU Water~~~ HDU 100 ...
- HDU.1007 Quoit Design
文章目录 一.题目解读 1.原题 2.分类 3.题意 4.输入输出格式 5.数据范围 二.题解参考 1.总体思路 2.思路② (1).分析 (2).AC代码 三.总结与后话 1.评价 2.后话 一.题 ...
- (nlogn)的时间复杂度求 最近点对 hdu 1007 凹凸曼与小怪兽的故事 poj3714 Raid...
hdu 1007 Quoit Design http://acm.hdu.edu.cn/showproblem.php?pid=1007 zoj 2107 Quoit Design http://a ...
- HDU 4631 Sad Love Story 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短 ...
- HDU 5721 Palace(平面最近点对(分治))
http://acm.hdu.edu.cn/showproblem.php?pid=5721 n个点,去掉一个点的情况下,最近距离平方之和. 平面最近点对模版题,先求出最近距离,然后找到是哪两个点,然 ...
- hdu 1007(最近点对)
最近点对问题定义:已知上m个点的集合,找出对接近的一对点. 在二维空间里,可用分治法求解最近点对问题.预处理:分别根据点的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y中的点就是S中的 ...
- 【HDU - 1031 】Design T-Shirt(水题 排序)
题干: Soon after he decided to design a T-shirt for our Algorithm Board on Free-City BBS, XKA found th ...
- HDU 1007 Quoit Design(分治)
Description 给出n个点的坐标,输出点集中距离最近两点间距离的一半 Input 多组输入,每组用例第一行为点数n,之后n行每行两个浮点数表示一个点的横纵坐标,以n=0结束输入 O ...
最新文章
- SQL Server 存储过程的分页
- I.MX6 WIFI wireless_tools 移植
- 英特尔与博雅睿视共同发布SVT-AVS3实时编码器
- JQuery课堂学习笔记
- 在ubuntu16.04上安装java和elastic search
- python使用pip离线下载并安装包
- 全面分析男性护肤三大误区 - 生活至上,美容至尚!
- Vue3+ts+vite 国际化处理
- 2G维码器-以及4G维码器--基于合宙air202 air720sl luat
- Unity (NavMeshAgent 导航系统)
- 甘超波:NLP如何挖掘信念
- mysql临时表在哪找_MySQL 中的临时表
- Visual paradigm试用版绘制ER图时如何去水印
- 360天擎卸载(2021年亲测有效)
- Qt Creator5.7添加qwt绘图插件之成功案例解析
- 淘宝补单发货地不一样可以吗?正确补单流程是什么?
- FILEminimizer Office,FILEminimizer Suite和FILEminimizer Server常见问题FAQ合集(一)
- 如何用 VS Code remote 插件编辑远程 linux 服务器上的文件
- 耳中明珠绾臂金环:古代女子私妆的故事(组图)
- golang testify 测试库
热门文章
- 怎么测试服务器的性能,如何测试服务器性能
- MySQL8.0.26 开启bin_log日志 linux
- bash: shasum: command not found
- 企业实战(Jenkins+GitLab+SonarQube)_11_Jenkins权限的划分
- 加密相关(对称加密、非对称加密、信息摘要、数字签名、CA数字证书)
- 小程序开发(2)-之app.js、app.wxss、project.config.json说明
- 捕获和抛出异常(Ctrl+Alt+T)
- html-网页基本信息
- 苹果手机数据线充不了电_手机充电器充不了电?其实4招就能解决
- 申请美国计算机科学,美国计算机科学的申请特点