当前位置: 首页 > news >正文

经典算法 最近点对问题

题目描述

p₁=(x₁, y₁), p₂=(x₂, y₂), …, pₙ=(xₙ, yₙ) 是平面上 n 个点构成的集合 S,请设计算法找出集合 S 中距离最近的点对。


输入格式

  • 多组测试数据。
  • 第一行为测试数据组数 n,其中 0 < n ≤ 100
  • 每组测试数据由两个部分组成:
    • 第一行为一个整数 m,表示该组中点的个数,0 < m ≤ 1000
    • 接下来 m 行,每行两个整数 xy,表示一个点的坐标,满足 0 < x, y ≤ 100000

输出格式

  • 每组测试数据输出一行,为该组数据中最近点对的距离。
  • 距离保留 4 位小数

输入样例

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

输出样例

1.0000
1.0000

c++代码

#include<stdio.h>
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

ll n, m;
vector<vector<double>> arr;

bool sort_by_x(vector<double> a, vector<double> b) {
    return a[0] < b[0];
}

bool sort_by_y(vector<double> a, vector<double> b) {
    return a[1] < b[1];
}

double recent_questions(ll l, ll r) {
    if (l == r) return DBL_MAX;
    if (r - l == 1) return (arr[l][0] - arr[r][0]) * (arr[l][0] - arr[r][0]) + (arr[l][1] - arr[r][1]) * (arr[l][1] - arr[r][1]);
    ll mid = (l + r) / 2;
    double res = min(recent_questions(l, mid), recent_questions(mid + 1, r));
    vector<vector<double>> tem;
    for (int i = l; i <= r; i++) {
        if ((arr[i][0] - arr[mid][0]) * (arr[i][0] - arr[mid][0]) <= res) tem.push_back({arr[i][0], arr[i][1]});
    }
    sort(tem.begin(), tem.end(), sort_by_y);
    for (int i = 0; i < tem.size(); i++) {
        for (int j = i + 1, cont = 0; j < tem.size(); j++, cont++) {
            res = min(res, (tem[i][0] - tem[j][0]) * (tem[i][0] - tem[j][0]) + (tem[i][1] - tem[j][1]) * (tem[i][1] - tem[j][1]));
            if (cont == 7) break;
        }
    }
    return res;
}

int main() {
    scanf("%lld", &n);
    while(n--) {
        scanf("%lld", &m);
        arr = vector<vector<double>>(m, vector<double>(2, 0));
        for (int i = 0; i < m; i++) {
            scanf("%lf %lf", &arr[i][0], &arr[i][1]);
        }
        sort(arr.begin(), arr.end(), sort_by_x);
        printf("%.4lf\n", sqrt(recent_questions(0, m - 1)));
    }
}//by wqs
http://www.dtcms.com/a/122902.html

相关文章:

  • 猜猜乐游戏(python)
  • Trae AI 保姆级教程:从安装到调试全流程指南
  • FastAdmin和thinkPHP学习文档
  • 国标GB28181协议EasyCVR视频融合平台:5G时代远程监控赋能通信基站安全管理
  • 文字识别 (OCR) 工具
  • js 拷贝-包含处理循环引用问题
  • c++和python复制java文件到指定目录
  • AQS机制详解与总结
  • java方法07:加减乘除计算器
  • rkmpp 解码 精简mpi_dec_test.c例程
  • LeetCode 热题 100 题解记录
  • Docker Hello World
  • 计算机网络 实验三:子网划分与组网
  • GaussDB性能调优:从根因分析到优化落地
  • 10. git switch
  • Java MCP SDK 开发笔记(一)
  • 深度学习疑问--Transformer【3】:transformer的encoder和decoder分别有什么用?encoder是可以单独使用的吗
  • WHAT - React 进一步学习推荐
  • Electron 应用太重?试试 PakePlus 轻装上阵
  • LVM 扩容详解
  • 0 std::process::Command 介绍
  • 中小型网络拓扑图静态路由方式
  • 监测fastapi服务并自动拉起(不依靠dockerfile)
  • 低代码开发平台:飞帆画 echarts 仪表盘
  • Redis最佳实践——用户会话管理详解
  • 金陵幻境录——六朝古都的科技诗篇-南京
  • go游戏后端开发29:实现游戏内聊天
  • 用 HTML 网页来管理 Markdown 标题序号
  • 【微服务架构】SpringCloud Alibaba(九):分布式事务Seata使用和源码分析(TCC模式、Saga模式)
  • 分布式锁阿