poj 3714 寻找最近点对
参考自《编程之美》169页,大概原理就是把区间分成两部分,然后递归找每一部分中最近的点对,还有一种情况就是这个点对分属于这两部分,然后选两部分中的部分点枚举即可,取其最小值。
//2013-10-21-17.18
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <iostream>
const double INF=1e100; using namespace std; struct node
{
double x, y;
bool flag;
}p[200005], tmp[200005]; bool cmpx(node a, node b)
{
return a.x < b.x;
} bool cmpy(node a, node b)
{
return a.y < b.y;
} double dis(node a, node b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
} double getans(int l, int r)
{
double rs = INF;
if (l == r)
return rs;
if (r - 1 == l)
{
if (p[l].flag == p[r].flag)
return rs;
return dis(p[l], p[r]);
}
int mid = (l+r)>>1;
rs = getans(l, mid);
rs = min(rs, getans(mid+1, r));
int cnt = 1;
for (int i = l; i <= r; i++)
{
if (fabs(p[i].x - p[mid].x) <= rs)
tmp[cnt++] = p[i];
}
sort(tmp+1, tmp+cnt, cmpy); for (int i = 0; i < cnt; i++)
{
for (int j = i+1; j < cnt; j++)
{
if (fabs(tmp[i].y-tmp[j].y) >= rs)
break;
if (tmp[i].flag != tmp[j].flag)
rs = min(rs, dis(tmp[i], tmp[j]));
}
}
return rs;
} int main()
{
int t, n;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
int i = 1;
for (; i <= n; i++)
{
scanf("%lf %lf", &p[i].x, &p[i].y);
p[i].flag = false;
}
n <<= 1;
for (; i <= n; i++)
{
scanf("%lf %lf", &p[i].x, &p[i].y);
p[i].flag = true;
}
sort(p+1, p+n+1, cmpx);
printf("%.3lf\n", getans(1, n));
}
return 0;
}
poj 3714 寻找最近点对的更多相关文章
- 最近点对问题 POJ 3714 Raid && HDOJ 1007 Quoit Design
题意:有n个点,问其中某一对点的距离最小是多少 分析:分治法解决问题:先按照x坐标排序,求解(left, mid)和(mid+1, right)范围的最小值,然后类似区间合并,分离mid左右的点也求最 ...
- (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714
这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...
- 编程之美 set 6 寻找最近点对
这道题在算法课上当做例题讲过, 当时的印象也比较深 另有一道近似算法的题也在算法课上讲过, 并且印象更深, 复习的时候完全没管, 以为志在必得, 结果真考了那道近似算法, 我却没能打出来 为避免阴沟翻 ...
- poj 3714 Raid(平面最近点对)
Raid Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7473 Accepted: 2221 Description ...
- POJ 3714 Raid(计算几何の最近点对)
Description After successive failures in the battles against the Union, the Empire retreated to its ...
- POJ 3714 分治/求平面最近点对
第一次见这种问题直接懵圈...没想到分治法这么强大,借鉴了lyd的代码: 代码如下 #include<cstdio> #include<algorithm> #include& ...
- 【POJ 3714】 Raid
[题目链接] http://poj.org/problem?id=3714 [算法] 分治求平面最近点对 [代码] #include <algorithm> #include <bi ...
- 【POJ 3714】Raid
[题目链接]:http://poj.org/problem?id=3714 [题意] 给你两类的点; 各n个; 然后让你求出2*n个点中的最近点对的距离; 这里的距离定义为不同类型的点之间的距离; [ ...
- POJ 3714 Raid
Description After successive failures in the battles against the Union, the Empire retreated to its ...
随机推荐
- 在 Angular 2 Component 中使用第三方 JS 库
本文所有内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言. 如上图,最近遇到一个需求,需要在一个刚启动的 Angular 2 项目中使用 snap.sv ...
- Java学习笔记——设计模式之九.建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...
- 找不到’geckodriver’ 的环境path问题“ Message: 'geckodriver' executable needs to be in PATH. ”
运行测试脚本报找不到’geckodriver’ 的环境path 的错误 selenium3.x webdriver/firefox/webdriver.py的init中,executable_pat ...
- 半小时学会V语言
半小时学会V语言 1. V语言简介 V是一个静态类型.编译型的编程语言,目标是构建可维护软件.与Go语言相似,并受Oberon,Rust和Swift语言影响.V语言非常简单,只需要半小时就能学会这门语 ...
- mysql双机热备实现方案
一.概念 1.热备份和备份的区别 热备份指的是:High Available(HA)即高可用,而备份指的是Backup,数据备份的一种.这是两种不同的概念,应对的产品也是两种功能上完全不同的产品.热备 ...
- Linux嵌入式kgdb调试环境搭建
======================= 我的环境 ==========================PC 端: win7 + vmware-15 ubuntu16.04开发板:Freesca ...
- Linux查看进程具体开启时间
ps -p 2417 -o lstart -- 2417为进程号
- CentOS中对MySql的root用户重置密码
由于一般的修改ini文件来完成无密码登录数据库容易造成较大风险,所以使用修改启动服务参数的方式来更新user表,达到无密码登陆的目的. 1.关闭系统下运行的mysql服务 (1)杀掉进程号达到关闭目的 ...
- c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...
- Mybatis辅助神器-MyBatis Log Plugin
1. 问题描述 Java操作数据库的两台流行天王-mybatis和hibernate,mytabis和hibernate的区别不想废话了,以前用hibernate,最近几年一直用的mybatis,目前 ...