题目描述:
经过 11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。
当工作半径为 0 时,则能够拦截与它位置恰好相同的导弹。
但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。
而当天的使用代价,就是所有系统工作半径的平方和。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统尚处于试验阶段,所以只有两套系统投入工作。
如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。
输入格式:
第一行包含 4 个整数x1、y1、x2、y2,每两个整数之间用一个空格隔开,表示这两套导弹拦截系统的坐标分别为(x1,y1)、(x2,y2)。
第二行包含 1 个整数N,表示有N颗导弹。接下来N行,每行两个整数x、y,中间用一个空格隔开,表示一颗导弹的坐标(x,y),不同导弹的坐标可能相同。
输出格式:
只有一行,包含一个整数,即当天的最小使用代价。
数据范围:
1≤N≤105,所有坐标分量的绝对值都不超过 1000。
输入样例:
0 0 6 0
5
-4 -2
-2 3
4 0
6 -2
9 1
输出样例:
30
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
//定义结构体
static class Dpoint{
public int d1,d2;
public Dpoint(int d1,int d2) {
this.d1 = d1;
this.d2 = d2;
}
}
//计算导弹到雷达的距离
static int getDistance(int x1,int y1,int x2,int y2) {
int dx = x1 - x2, dy = y1 - y2;
return dx*dx + dy*dy;
}
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
//两个雷达所在位置
int x1 = read.nextInt(),y1 = read.nextInt();
int x2 = read.nextInt(), y2 = read.nextInt();
//用于存放导弹到两个雷达点的距离
ArrayList<Dpoint> ps = new ArrayList<>();
int n = read.nextInt();//导弹数
for(int i = 1; i <= n;i++) {
int x = read.nextInt(),y = read.nextInt();
int d1 = getDistance(x1,y1,x,y);//导弹到雷达一的距离
int d2 = getDistance(x2,y2,x,y);//导弹到雷达二的距离
ps.add(new Dpoint(d1,d2));//将距离加入到ps
}
//对距离进行降序排序
ps.sort((o1,o2) -> o2.d1 - o1.d1);
//下面为初始状态,所有导弹都放在雷达一范围内
int r1 = ps.get(0).d1, r2 = 0, res = r1 + r2;
for(int i = 1; i < ps.size(); i++) {
//依次将雷达一中最远的点归入雷达二
Dpoint cur = ps.get(i), pre = ps.get(i-1);
//更新两个雷达的半径
r1 = cur.d1;
r2 = Math.max(r2, pre.d2);
//取最小的
res = Math.min(res, r1 + r2);
}
System.out.println(res);
}
}