You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.7 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int a1, b1, a2, b2;
struct Point {
int x, y;
int d;
bool operator<(const Point &W) const {
return d < W.d;
}
} point[N];
// 利用欧几里得距离,计算两点间的距离平方,也就是半径的平方
int get_dist(int x1, int y1, int x2, int y2) {
int dx = x1 - x2;
int dy = y1 - y2;
return dx * dx + dy * dy;
}
int main() {
scanf("%d%d%d%d", &a1, &b1, &a2, &b2);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x, y;
scanf("%d%d", &x, &y);
point[i] = {x, y, get_dist(x, y, a1, b1)}; // 计算每个导弹到A1拦截系统的距离
}
// 按距离由大到小排序
sort(point, point + n);
reverse(point, point + n);
int res = point[0].d, r = 0; // res初始化为离A1拦截系统最远的导弹距离,r是A2拦截系统的半径因为如果最远的都归A1系统拦截那么A2什么也不用拦截半径为0
for (int i = 0; i < n; i++) { // 枚举每个导弹
r = max(r, get_dist(point[i].x, point[i].y, a2, b2)); // 更新与A2拦截系统的距离,也就是A2系统的半径
res = min(res, point[i + 1].d + r); // 由于是按距离A1拦截系统由大到小排序所以point[i+1]意味着把[0~i]的给A2拦截[i+1,n-1]归A1拦截
}
// 注意这里面i=n-1时point[i+1].d=point[n-1+1].d=point[n].d此时point[n].d是0
// point[i + 1].d + r=r,这时的真实场景是把所有导弹都让A2拦截系统拦截A1一个也不拦截
// 输出答案
printf("%d\n", res);
return 0;
}