3714
题目介绍:

题目简介:一组士兵一组站,求两个的最短距离
方法:可以当作最近点对问题的模版题
解题思路:
- 首先把此问题转换成一个最近点对问题,目前有两个阵营,为了避免最后求得最短距离的是同一阵营的,在求两点距离时将同一阵营的距离设为INF即可,之后可以按照模板进行求解。
- 二分法求解一维最近点对的步骤大致如下:
- 将所有无序坐标点按照X轴进行排序,从中间分开分成两堆进行分治。
- 先考虑左右两堆的最小距离,利用递归进行求解,将结果赋值给ans。
- 在考虑跨堆的情况。按照ans缩小选择范围,将范围内的按照Y轴大小进行排序。从上到下,遍历以左边每个点的圆心,ans为半径的圆内的所有点,不断更新ans。注意,在这样的遍历规则下,左边选取的点一定在右边选取的点的上面。
- 最终得到该问题的答案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;
}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