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

算法进阶指南 袭击

题目描述

在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点。依靠其强大的防御系统,帝国击退了联盟的六波猛烈进攻。

经过几天的苦思冥想,联盟将军亚瑟终于注意到帝国防御系统唯一的弱点就是能源供应。

该系统由 N 个核电站提供能源,其中任意一个被摧毁都会使防御系统失效

将军派出了 N 个特工进入据点之中,打算对能源站展开一次突袭。

不幸的是,由于受到帝国空军的袭击,他们未能降落在预期位置。

作为一名经验丰富的将军,亚瑟很快意识到需要重新安排突袭计划。

他现在最想知道的事情就是:

哪个特工距离任意一个发电站的距离最短?请计算这个最短距离是多少。


输入格式

  • 输入包含多组测试用例。
  • 第一行输入一个整数 T,表示测试用例的数量。

对于每个测试用例:

  1. 第一行输入一个整数 N,表示核电站和特工的数量。
  2. 接下来 N 行,每行输入两个整数 X Y,表示每个核电站的位置坐标。
  3. 再接下来 N 行,每行输入两个整数 X Y,表示每名特工的位置坐标。

输出格式

  • 对于每个测试用例,输出一个浮点数,表示最近的距离,保留三位小数
  • 每个输出占一行。

数据范围

  • 1 ≤ N ≤ 100000
  • 0 ≤ X, Y ≤ 1,000,000,000

输入样例

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

c++代码

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

using namespace std;
int T, N;

class node{
public:
    double i;
    double j;
    int sym;
};

bool sort_by_x(node a, node b) {
    return a.i < b.i;
}

bool sort_by_y(node a, node b) {
    return a.j < b.j;
}

double op(double x1, double y1, double x2, double y2) {
    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}

double recent_questions(vector<node>& arr, int l, int r) {
    if (l >= r) return DBL_MAX;
    if (r - l == 1) {
        if (arr[l].sym == arr[r].sym) return DBL_MAX;
        return op(arr[l].i, arr[l].j, arr[r].i, arr[r].j);
    }
    int mid = (l + r) / 2;
    double res = min(recent_questions(arr, l, mid), recent_questions(arr, mid + 1, r));
    vector<node> tem;
    for (int i = l; i <= r; i++) {
        if ((arr[i].i - arr[mid].i) * (arr[i].i - arr[mid].i) <= res) tem.push_back(arr[i]);
    }
    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() && cont < 7; j++, cont++) {
            if (tem[i].sym != tem[j].sym) {
                res = min(res, op(tem[i].i, tem[i].j, tem[j].i, tem[j].j));
            }
        }
    }
    return res;
}

int main() {
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &N);
        vector<node> arr(2 * N);
        for (int i = 0; i < N; i++) {
            scanf("%lf %lf", &arr[i].i, &arr[i].j);
            arr[i].sym = 0;
        }
        for (int i = N; i < 2 * N; i++) {
            scanf("%lf %lf", &arr[i].i, &arr[i].j);
            arr[i].sym = 1;
        }
        sort(arr.begin(), arr.end(), sort_by_x);
        printf("%.3lf\n", sqrt(recent_questions(arr, 0, 2 * N - 1)));
    }
    return 0;
}//by wqs

这个就是最近点对问题

http://www.dtcms.com/a/122784.html

相关文章:

  • 蓝桥杯 跑步计划(模拟日期)
  • JMeter从入门到荒废-常见问题汇总
  • go游戏后端开发30:弃牌逻辑与后续操作
  • vue3中左右布局两个个组件使用vuedraggable实现左向右拖动,右组件列表可上下拖动
  • rook-ceph xx/xxx objects misplaced (xx%)
  • 基于大模型应用技能的学习路径
  • NO.80十六届蓝桥杯备战|数据结构-字符串哈希|兔子与兔子(C++)
  • CCRC 与 EMVCo 双认证:中国智能卡企业的全球化突围
  • git 总结遇到的问题
  • B+树与红黑树
  • 第三章:SQL 高级功能与性能优化
  • CentOS 中下载rpm包并安装
  • PhpStorm配置函数和文件注释模板
  • Python设计模式:工厂模式
  • 凯斯西储大学CWRU数据集变体
  • python中的数据模型-pydantic浅讲
  • 02_SQL分库分表及Java实现
  • 【重构谷粒商城12】npm快速入门
  • Python第八章:数据可视化——Json数据
  • Android 开发中compileSdkVersion 和 targetSdkVersion
  • Vue2下载二进制文件
  • 【动手学深度学习】LeNet:卷积神经网络的开山之作
  • 【面试】封装、继承、多态的具象示例 模板编程的理解与应用场景 链表适用的场景
  • 【vue】slot插槽:灵活内容分发的艺术
  • R语言——散点图
  • 第九章:可靠通信_《凤凰架构:构建可靠的大型分布式系统》
  • WHAT - React useId vs uuid
  • Pascal VOC 2012 数据集格式与文件结构
  • 前端性能优化的全方位方案【待进一步结合项目】
  • Redis 持久化+性能管理+缓存