POJ 2659 Raid|分治法|平面最近点对

2023-11-08

题目描述

总时间限制: 1000ms 内存限制: 65536kB

描述

After successive failures in the battles against the Union, the Empire retreated to its last stronghold. Depending on its powerful defense system, the Empire repelled the six waves of Union's attack. After several sleepless nights of thinking, Arthur, General of the Union, noticed that the only weakness of the defense system was its energy supply. The system was charged by N nuclear power stations and breaking down any of them would disable the system.

The general soon started a raid to the stations by N special agents who were paradroped into the stronghold. Unfortunately they failed to land at the expected positions due to the attack by the Empire Air Force. As an experienced general, Arthur soon realized that he needed to rearrange the plan. The first thing he wants to know now is that which agent is the nearest to any power station. Could you, the chief officer, help the general to calculate the minimum distance between an agent and a station?

输入

The first line is a integer T representing the number of test cases.
Each test case begins with an integer N (1 ≤ N ≤ 1000).
The next N lines describe the positions of the stations. Each line consists of two integers X (0 ≤ X ≤ 1000000000) and Y (0 ≤ Y ≤ 1000000000) indicating the positions of the station.
The next following N lines describe the positions of the agents. Each line consists of two integers X (0 ≤ X ≤ 1000000000) and Y (0 ≤ Y ≤ 1000000000) indicating the positions of the agent.  

输出

For each test case output the minimum distance with precision of three decimal placed in a separate line.

样例输入

2
4
0 0
0 1
1 0
1 1
2 2
2 3
3 2
3 3
4
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0

样例输出

1.414
0.000

问题解决

1.暴力

这到底第一个想到的必然是暴力哈哈哈,只要O(n^2)就可以轻松水过:

#include <iostream>
#include <algorithm>
using namespace std;
struct node{
    int x,y;
};
node station[1005];
node agent[1005];
int T,N;


int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        for(int i=0;i<N;i++){
            scanf("%d%d",&station[i].x,&station[i].y);
        }
        for(int i=0;i<N;i++){
            scanf("%d%d",&agent[i].x,&agent[i].y);
        }
        double mindist=10000000;
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                double dist=sqrt((station[i].x-agent[j].x)*(station[i].x-agent[j].x)+(station[i].y-agent[j].y)*(station[i].y-agent[j].y));
                if(dist<mindist) mindist=dist;
            }
        }
        printf("%.3f\n",mindist);

    }
    return 0;
}

2.分治法

But!老师说了不能水过,所以就用了课上讲的closest pair算法,重新写了一遍,这个算法主要就是将所有点按照横坐标排序,然后从中间一分为二,找到左右两边的最短距离,然后在最短距离内遍历所有的pair,如有更小的就更新。

#include <iostream>
#include <algorithm>
#define station 0
#define agent 1
using namespace std;

typedef long long LL;
const LL INF=10000000000;

struct node{
    LL x,y;
    int id;
    node(LL x=0,LL y=0, int id=0):x(x),y(y),id(id){}
    const bool operator <(const node other)const{
        if(x==other.x) return y<other.y;
        else return x<other.x;
    }
}nodes[2005];

double dis(int a, int b) {
    return sqrt((double)((nodes[a].x - nodes[b].x)*(nodes[a].x - nodes[b].x) + (nodes[a].y - nodes[b].y)*(nodes[a].y - nodes[b].y)));
}
int T,N;

double closestpair(int l,int r){
    if (l==r) return INF;
    int mid=(l+r)>>1;
    double d1=closestpair(l,mid);
    double d2=closestpair(mid+1,r);
    double d=min(d1,d2);
    for(int i=mid;i>=1;i--){
        if(nodes[mid].x-nodes[i].x > d) break;
        for(int j=mid+1;j<=r;j++){
            if(nodes[j].x-nodes[mid].x > d) break;
            double tmp = dis(i,j);
            if(nodes[i].id!=nodes[j].id && tmp<d) d=tmp;
        }
    }
    return d;
}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        for(int i=0;i<N;i++){
            scanf("%lld%lld",&nodes[i].x,&nodes[i].y);
            nodes[i].id=station;
        }
        for(int i=N;i<2*N;i++){
            scanf("%lld%lld",&nodes[i].x,&nodes[i].y);
            nodes[i].id=agent;
        }
        sort(nodes,nodes+2*N);
        double mindist = closestpair(0,2*N-1);
        printf("%.3lf\n",mindist);

    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POJ 2659 Raid|分治法|平面最近点对 的相关文章

  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网

随机推荐

  • mybatis——example文件形式——多表联查

    mybatis example文件形式 多表联查 并且每个表中都有同样的id不能识别问题解决 方法名称 orderListByStatus mapper xml文件中写法
  • 酷炫的python日志库-loguru

    Loguru是一个python的日志库 比logging更简单 好用 功能丰富 GitHub Delgan loguru Python logging made stupidly simple 安装 pip install loguru 特
  • asp.net2.0学习历程 菜鸟到中级程序员的飞跃

    asp net2 0学习历程 菜鸟到中级程序员的飞跃 如果你是一个菜鸟或者自认为初学者那么本文非常适合你 不能说这30本书就是最佳组合 但是可以说这个组合不差 本人曾博览群书 很多书重复 很多书讲的不适用 这些书都是目前书店可以买到的 达到
  • 创建Springboot+vue3项目

    项目概述 创建springboot项目 加入mybatis plus支持 1 加入依赖代码 2 创建数据库实例 3 yml文件的配置 4 编写测试代码 5 测试结果 创建vue项目 报错 错误一 错误二 错误三 项目概述 后端 Spring
  • javaweb知识点总结

    JavaWeb JDBC 简介 JDBC就是使用Java语言操作关系型数据库的一套API 快速入门 0 创建工程 导入驱动jar包 mysql connector java 5 1 48 jar 1 注册驱动 Class forName c
  • 贪吃蛇游戏(java)(全注释)

    没想到发的第一篇关于java的博客会是这个 写作业用来练手 顺道就搬上来了 代码肯定不最优的 欢迎大家一起来探讨 先搬个效果图 然后结构 一共分成4个部分 Define包下有蛇 食物和成绩数据的类 主要包括他们的初始化和像蛇的移动之类的东西
  • 决策树(Decision Tree)-机器学习ML

    参考 1 统计学习方法 李航 2 https baike baidu com item E5 86 B3 E7 AD 96 E6 A0 91 10377049 fr aladdin 3 http www jianshu com p 6eec
  • qt 手动设置控件的位置

    QT中的Layout用着很不错 但有时候你想指定控件绝对位置 用以下红色代码就可以了 chanel1 new QPushButton tr 通道1 chanel1 gt setGeometry rect x 200 rect y 10 10
  • HTTP协议与HTTPS协议的区别

    一 HTTP和HTTPS的基本概念 1 HTTP 是互联网上应用最为广泛的一种网络协议 是一个客户端和服务器端请求和应答的标准 TCP 用于从WWW服务器传输超文本到本地浏览器的传输协议 它可以使浏览器更加高效 使网络传输减少 2 HTTP
  • 在数组中寻找和为目标值的 N 项(算法)

    这类问题可以使用递归 动态规划 或者回溯的方式完成 下面我将使用递归来完成这个算法的实现 递归函数 用于在数组中寻找 n 项之和等于目标值的组合 function findNSum nums target n startIndex curr
  • Java代码块的基本使用

    概念 在Java中 使用 括起来的代码被称为代码块 局部代码块 位置 方法中定义 特点 执行完就会在内存中消失 作用 限定变量的生命周期 及早释放 提高内存利用率 public static void main String args in
  • Java导出zip压缩包

    使用Java导出zip压缩包 压缩包中包含一个文件夹和一个文件 其中文件夹包含另一个文件 代码 package com sunshuo start import java io File import java io FileOutputS
  • uboot启动第二阶段——C语言

    1 给全局变量gd分配内存 详情参考 uboot中重要的全局变量 gd 2 计算重定位的代码长度 armboot start word start monitor flash len bss start armboot start 要重定位
  • h5ai搭建自己的文件分享程序

    h5ai搭建自己的文件分享程序 最近使用网盘分享一些资料 但是却被删除 现在感觉还是放在自己的服务器上比较放心 今天就介绍下安装h5ai这个目录程序 他可以把对应目录下的文件和文件夹全部显示在web页面上 只需点击即可下载对应的资料 h5a
  • vue——Props属性和Data属性概述

    利用Props可以进行组件之间数据传递 类似于React的Props Props 父组件向子组件传递数据 动态props 子组件向父组件传递了数据 子组件向子组件传递数据 Data 使用data data选项 数据 computed 声明式
  • 深度学习中常用的损失函数

    文章目录 一 什么是损失函数 二 分类任务损失 1 0 1 loss 2 熵与交叉熵loss 3 softmax loss及其变种 4 KL散度 5 Hinge loss 6 Exponential loss与Logistic loss 三
  • svn 回滚

    1 从svn log界面中查看所有的版本 右键后选择 revert to this revision 2 确认无问题后 svn commit 另外 选中任意两个版本 右键可以选择 compare 进行比较 在网上搜了半天 最后还是 RTFM
  • EXCEL实现分层自定义比例随机抽样(图+文教程)

    EXCEL实现分层自定义比例随机抽样 图 文教程 单一字段分层自定义比例随机抽样 多字段分层自定义比例随机抽样 单一字段分层自定义比例随机抽样 首先数据源如下 我们想随机抽张三的金额数据10 李四金额20 王五5 哈哈15 李六10 首先第
  • 排序公式 与 组合公式

    总结 C 代表 Combination 组合数 A 代表 Arrangement 排列数 在旧教材为P permutation 排列 N 代表 元素的总个数 M 代表 参与选择的元素个数 代表 阶乘 博客 http jingyan baid
  • POJ 2659 Raid|分治法|平面最近点对

    题目描述 总时间限制 1000ms 内存限制 65536kB 描述 After successive failures in the battles against the Union the Empire retreated to its