ACWing443 导弹拦截
Last updated
Last updated
0 0 6 0
5
-4 -2
-2 3
4 0
6 -2
9 130本题其实用简单的枚举就可以做出来,本题有两个导弹发射系统,对于第一套系统,它可取的半径实际上最多有N+1个(N个不同的导弹对应N个不同的半径,还有一个可以取0),每一种半径都能包含一定的导弹,剩下的导弹交给另一套导弹系统即可,所以只要枚举这N+1种情况,在实际操作的过程中,首先要按照这些导弹离第一套系统的距离进行排序,否则每种情况都要循环判断哪些导弹在射程之内,会增加时间复杂度。import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.lang.Math;
public class Main {
static int x1,y1,x2,y2;
static int N;
static StreamTokenizer in;
static PrintWriter out;
static class point implements Comparable<point>{
public int d1,d2;//这里的两个属性是到两套导弹系统的距离,而不是它的坐标,这样可以节省资源
public point(int d1,int d2) {
this.d1=d1;
this.d2=d2;
}
public int compareTo(point p) {
return p.d1-d1;
}
}
public static void main(String args[]) throws IOException {
in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
in.nextToken();
x1=(int)in.nval;
in.nextToken();
y1=(int)in.nval;
in.nextToken();
x2=(int)in.nval;
in.nextToken();
y2=(int)in.nval;
in.nextToken();
N=(int)in.nval;
point points[]=new point[N];
//获取输入的导弹数据,并处理为距离
for(int i = 0;i<N;i++) {
in.nextToken();
int x=(int)in.nval;
in.nextToken();
int y=(int)in.nval;
points[i]=new point((x-x1)*(x-x1)+(y-y1)*(y-y1), (x-x2)*(x-x2)+(y-y2)*(y-y2));
}
Arrays.sort(points);
int cos=0;
int d1,d2=0;
d1=points[0].d1;
d2=0;
int result=d1;
for(int i =1;i<N;i++) {
d1=points[i].d1;
d2=Math.max(points[i-1].d2,d2);
result=Math.min(result, d1+d2);
}
out.println(result);
out.flush();
}
}