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 ...
随机推荐
- Go 程序是怎样跑起来的
目录 引入 编译链接概述 编译过程 词法分析 语法分析 语义分析 中间代码生成 目标代码生成与优化 链接过程 Go 程序启动 GoRoot 和 GoPath Go 命令详解 go build go i ...
- java泛型的作用及其基本概念
一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...
- Codeforces Round #568 (Div. 2)B
B. Email from Polycarp 题目链接:http://codeforces.com/contest/1185/problem/B 题目: Methodius received an e ...
- 跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: ...
- Git使用小技巧之多个远程仓库
想要获取更多文章可以访问我的博客 - 代码无止境. 这是一个普通的工作日,小代正在勤勤恳恳的写代码.这时陈BOSS走到小代身边,跟小代说:"我们的代码需要同时推送到Github和码云两个仓库 ...
- fiddler无法抓取chrome浏览器请求的解决方案之关闭代理软件
最近安装fiddler后,按照通用设置后依然无法抓取到chrome的请求,经检查,我本地的chrome安装了代理管理的插件Switchy,无论选择直接连接还是选择使用代理连接,插件都会屏蔽fiddle ...
- vue中修改子组件样式
一.问题叙述 项目里需要新添加一个表单页面,里面就只是几个select,这个几个select是原本封装好的组件,有自己原本的样式,而这次的原型图却没有和之前的样式统一起来,需要微调一下,这里就涉及到父 ...
- Windows环境部署Redis集群
一.准备文件 1. 下载Redis for windows 的最新版本 下载地址:https://github.com/MSOpenTech/redis/releases 安装到 c:\Redis ...
- [奇思异想]使用RabbitMQ实现定时任务
背景 工作中经常会有定时任务的需求,常见的做法可以使用Timer.Quartz.Hangfire等组件,这次想尝试下新的思路,使用RabbitMQ死信队列的机制来实现定时任务,同时帮助再次了解Rabb ...
- 洛谷 P1970 花匠
题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体而 ...