poj3714 最近点对
最近点对,采用分治方法。过程:
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 最近点对相关推荐
- POJ3714 Raid 平面最近点对
利用分治来求平面最近点对 只需要查后面6个点就好了 原因在于https://blog.csdn.net/liufeng_king/article/details/8484284 两个集合的话就把不同集 ...
- (nlogn)的时间复杂度求 最近点对 hdu 1007 凹凸曼与小怪兽的故事 poj3714 Raid...
hdu 1007 Quoit Design http://acm.hdu.edu.cn/showproblem.php?pid=1007 zoj 2107 Quoit Design http://a ...
- CF429D Tricky Function(求解公式、经分析转为求平面最近点对、思维)
整理的算法模板合集: ACM模板 目录 CF429D Tricky Function 题意实际上就是给定长度为 nnn 的一串序列a1,a2,...,ana_1, a_2,...,a_na1,a2 ...
- 平面分治详解 超级详细(附带例题 最近点对问题(给了题目))(UVA10245,P1257,P1429)
最近点对问题,大概意思平面有n个点,求距离最近的两个点对的距离(可用平面分治解决绝大部分情况) 首先如果一个一个比较,那就是n的二次方复杂度,那很多情况都会超时 我们考虑使用分治法,大概思路就是将这个 ...
- 新浪微博客户端(53)-记录用户最近点击表情
设计思路:每当用户点击一个表情,就将该表情(DJEmotion)存储到沙盒,当用户切换到"最近"栏目时,从沙盒中取出用户最近点击的表情列表,进行显示. 1. 保存DJEmotion ...
- [hdu4631 Sad Love Story]最近点对,枚举
题意:S是平面内点的集合,初始为空,每次向集合里面加入一个点P(x,y),询问S内最近点对的距离的平方和 思路:设当前集合的答案为D,则找到集合里面横坐标在(x-√D,x+√D)内的数,用它们来更新答 ...
- 分治法实现最近点对问题——C语言可视化
1. 分治法步骤 1.按x对点对数组进行从小到大排序 2.找出x中间值,按中间值划分数组为左右两部分 3.不断细分,找出左右两部分的最近点对 4.重复步骤1.2.3,得到最终左右两部分的最近点对的距离 ...
- HDU1007 查找平面最近点对
求点集中的最近点对有以下两种方法: 设p1=(x1, y1), p2=(x2, y2), -, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对. OJ题目:HDU ...
- Java实现算法导论中最近点对问题分治法
最近点对问题:给定平面上的N个点,找出距离最近的两个点.分治法: 1 )如果数组长度(即点的个数,一般≤3)在一定范围内时直接求出最近点,蛮力求解,递归退出条件: ...
最新文章
- CPU/GPU/TPU/NPU...XPU都是什么意思?
- 编程之美2.10:寻找数组中的最大值和最小值
- php5.5 mysql密码无法_MySQL密码正确却无法本地登录的解决方法
- 锁的释放流程-unparkSuccessor
- akshare 布林通道策略
- php数字从大到小生成,php输入几个数从大到小排序的案例
- EL表达式(Exprission language)
- VB实现可执行文件运行时自删除
- Ajax.Net之数据类型
- html页面转换pdf.txt
- 大学四年怎样过,做到这六点,甩别人一条街
- pytorch自然语言处理之Pooling层的句子分类
- POJ分层练习题目列表
- 2021日喀则市江孜高考成绩查询,2021西藏高考成绩查询时间 西藏高考成绩查询入口...
- Linux Shell Web超级终端工具shellinabox
- H3C 网管交换机快速配置指南(转)
- 免费获得卡巴斯基key的方法
- 关于采用消息钩子机制的透明加密的简单破解
- springboot框架图解
- python3字符串详解速查,新手流泪,老手顿悟
热门文章
- 我的世界服务器里怎么无限随机传送,我的世界随机传送插件使用教程 权限指令分享...
- 10鼎信诺为什么安装不了_鼎信诺审计软件一周常见问题(4.134.17)
- 手游极品飞车无限狂飙链接服务器失败,极品飞车无极限无法联网是什么原因 联网失败原因分析及解决方法...
- linux系统ll历史,Linux操作系统原理笔记
- mysql从库执行delete停止_MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析...
- 网管型交换机比普通交换机有哪些明显优势
- 【渝粤教育】广东开放大学 软件工程 形成性考核 (50)
- 【渝粤题库】陕西师范大学200851 微机实用技术
- 成都亿佰特物联网无线数传专家:lora无线传输模块网关技术的优缺点
- 2020-12-15通信原理