最近点对,采用分治方法。过程:
1对原数组依据x左标从小到大排序。
2二分数组,左边求出最小值,右边求出最小值,我们求最小的。
3找出对于左右两边的可能小于当前最小值的最近点对,更新最小值。
这题目需要区分一下点,让我们求的是闪兵到任意一个核电站的最短距离,加一个标志就可以了。
代码:

#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=200000+1;
const double INF=1e100;
struct Point{
double x,y;
bool flag;
};
Point m[N+1];
int tmp[N+1];
double dis(Point p1,Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double minL(double l1,double l2)
{
return l1<=l2?l1:l2;
}
bool cmpy(int a,int b)
{
return m[a].y<m[b].y;
}
bool cmpx(Point a,Point b)
{
return a.x<b.x;
}
double getMinLen(Point *s,int left,int right)
{
double rs=INF;
if(left == right)
return rs;
if(left+1 == right)
{
if(s[left].flag == s[right].flag)
return rs;
return dis(s[left],s[right]);
}
int mid=(left+right)>>1;
rs=getMinLen(s,left,mid);
rs=minL(rs,getMinLen(s,mid+1,right));//rs现在是两边中最点值了
int i,j,num=0;
for(i=left;i<=right;++i)
{
if(fabs(s[i].x-s[mid].x)<=rs)//过滤掉不可能是最近点对的点
tmp[num++]=i;
}
sort(tmp,tmp+num,cmpy);//按y坐标排序,减少比较次数
double d=INF;
for(i=0;i<num;++i)
{
for(j=i+1;j<num;++j)
{
if(fabs(s[tmp[i]].y-s[tmp[j]].y)>=rs)//i,j两点的y坐标已经大于rs,不需要在遍历了
break;
if(s[tmp[i]].flag!=s[tmp[j]].flag && (d=dis(s[tmp[i]],s[tmp[j]]))<rs)
rs=d;
}
}
//  cout<<left<<" "<<right<<" "<<rs<<endl;
return rs;
}
int main()
{
int t,n,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%lf%lf",&m[i].x,&m[i].y);
m[i].flag=0;
}
for(i=0;i<n;++i)
{
scanf("%lf%lf",&m[i+n].x,&m[i+n].y);
m[i+n].flag=1;
}
n<<=1;
sort(m,m+n,cmpx);
double ans=getMinLen(m,0,n-1);
cout<<setiosflags(ios::fixed)<<setprecision(3)<<ans<<endl;
}
return 0;
}

poj3714 最近点对相关推荐

  1. POJ3714 Raid 平面最近点对

    利用分治来求平面最近点对 只需要查后面6个点就好了 原因在于https://blog.csdn.net/liufeng_king/article/details/8484284 两个集合的话就把不同集 ...

  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 ...

  3. CF429D Tricky Function(求解公式、经分析转为求平面最近点对、思维)

    整理的算法模板合集: ACM模板 目录 CF429D Tricky Function 题意实际上就是给定长度为 nnn 的一串序列a1,a2,...,ana_1, a_2,...,a_na1​,a2​ ...

  4. 平面分治详解 超级详细(附带例题 最近点对问题(给了题目))(UVA10245,P1257,P1429)

    最近点对问题,大概意思平面有n个点,求距离最近的两个点对的距离(可用平面分治解决绝大部分情况) 首先如果一个一个比较,那就是n的二次方复杂度,那很多情况都会超时 我们考虑使用分治法,大概思路就是将这个 ...

  5. 新浪微博客户端(53)-记录用户最近点击表情

    设计思路:每当用户点击一个表情,就将该表情(DJEmotion)存储到沙盒,当用户切换到"最近"栏目时,从沙盒中取出用户最近点击的表情列表,进行显示. 1. 保存DJEmotion ...

  6. [hdu4631 Sad Love Story]最近点对,枚举

    题意:S是平面内点的集合,初始为空,每次向集合里面加入一个点P(x,y),询问S内最近点对的距离的平方和 思路:设当前集合的答案为D,则找到集合里面横坐标在(x-√D,x+√D)内的数,用它们来更新答 ...

  7. 分治法实现最近点对问题——C语言可视化

    1. 分治法步骤 1.按x对点对数组进行从小到大排序 2.找出x中间值,按中间值划分数组为左右两部分 3.不断细分,找出左右两部分的最近点对 4.重复步骤1.2.3,得到最终左右两部分的最近点对的距离 ...

  8. HDU1007 查找平面最近点对

    求点集中的最近点对有以下两种方法: 设p1=(x1, y1), p2=(x2, y2), -, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对. OJ题目:HDU ...

  9. Java实现算法导论中最近点对问题分治法

    最近点对问题:给定平面上的N个点,找出距离最近的两个点.分治法:              1 )如果数组长度(即点的个数,一般≤3)在一定范围内时直接求出最近点,蛮力求解,递归退出条件:       ...

最新文章

  1. CPU/GPU/TPU/NPU...XPU都是什么意思?
  2. 编程之美2.10:寻找数组中的最大值和最小值
  3. php5.5 mysql密码无法_MySQL密码正确却无法本地登录的解决方法
  4. 锁的释放流程-unparkSuccessor
  5. akshare 布林通道策略
  6. php数字从大到小生成,php输入几个数从大到小排序的案例
  7. EL表达式(Exprission language)
  8. VB实现可执行文件运行时自删除
  9. Ajax.Net之数据类型
  10. html页面转换pdf.txt
  11. 大学四年怎样过,做到这六点,甩别人一条街
  12. pytorch自然语言处理之Pooling层的句子分类
  13. POJ分层练习题目列表
  14. 2021日喀则市江孜高考成绩查询,2021西藏高考成绩查询时间 西藏高考成绩查询入口...
  15. Linux Shell Web超级终端工具shellinabox
  16. H3C 网管交换机快速配置指南(转)
  17. 免费获得卡巴斯基key的方法
  18. 关于采用消息钩子机制的透明加密的简单破解
  19. springboot框架图解
  20. python3字符串详解速查,新手流泪,老手顿悟

热门文章

  1. 我的世界服务器里怎么无限随机传送,我的世界随机传送插件使用教程 权限指令分享...
  2. 10鼎信诺为什么安装不了_鼎信诺审计软件一周常见问题(4.134.17)
  3. 手游极品飞车无限狂飙链接服务器失败,极品飞车无极限无法联网是什么原因 联网失败原因分析及解决方法...
  4. linux系统ll历史,Linux操作系统原理笔记
  5. mysql从库执行delete停止_MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析...
  6. 网管型交换机比普通交换机有哪些明显优势
  7. 【渝粤教育】广东开放大学 软件工程 形成性考核 (50)
  8. 【渝粤题库】陕西师范大学200851 微机实用技术
  9. 成都亿佰特物联网无线数传专家:lora无线传输模块网关技术的优缺点
  10. 2020-12-15通信原理