【POJ 3714】 Raid

博客详细介绍了如何解决POJ 3714问题,即求一组士兵中两个不同阵营间的最短距离。通过转化为最近点对问题并使用二分法,博主提供了具体的解题思路和完整代码,适用于C++和C语言编程者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3714

题目介绍:

在这里插入图片描述

题目简介:一组士兵一组站,求两个的最短距离
方法:可以当作最近点对问题的模版题
解题思路:
  1. 首先把此问题转换成一个最近点对问题,目前有两个阵营,为了避免最后求得最短距离的是同一阵营的,在求两点距离时将同一阵营的距离设为INF即可,之后可以按照模板进行求解。
  2. 二分法求解一维最近点对的步骤大致如下:
    1. 将所有无序坐标点按照X轴进行排序,从中间分开分成两堆进行分治。
    2. 先考虑左右两堆的最小距离,利用递归进行求解,将结果赋值给ans。
    3. 在考虑跨堆的情况。按照ans缩小选择范围,将范围内的按照Y轴大小进行排序。从上到下,遍历以左边每个点的圆心,ans为半径的圆内的所有点,不断更新ans。注意,在这样的遍历规则下,左边选取的点一定在右边选取的点的上面。
    4. 最终得到该问题的答案ans。
完整代码:
#include "iostream"
#include "string"
#include "cmath"
#include "algorithm"
#define Max_peo_num 100005
#define Max_group_num 1000
#define Max_loc_num 1000000005 //每个点的坐标范围
#define INF 0x7fffffff
typedef struct loc{
   
    double x,y;
    int flag;
    //区分阵营,0代表station,1代表agents,如果相同阵营,计算距离的时候返回INF,这样就可以
}location;
location point[2*Max_peo_num];
int center[2*Max_peo_num];
using namespace std;

void input(int peo_num){
   
    for(int j = 0; j<peo_num;j++){
   
        scanf("%lf %lf\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值