题目描述
经过 1111年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为 00时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。
某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。
输入格式
第一行包含 44个整数x_1x1、y_1y1、x_2x2、y_2y2,每两个整数之间用一个空格隔开,表示这两套导弹拦截系统的坐标分别为(x_1, y_1)(x1,y1)、(x_2, y_2)(x2,y2)。 第二行包含11 个整数NN,表示有 NN颗导弹。接下来NN行,每行两个整数 x,yx,y,中间用 一个空格隔开,表示一颗导弹的坐标(x, y)(x,y)。不同导弹的坐标可能相同。
输出格式
一个整数,即当天的最小使用代价。
输入数据 1
0 0 10 0
2
-3 3
10 0
Copy
输出数据 1
18
Copy
输入数据 2
0 0 6 0
5
-4 -2
-2 3
4 0
6 -2
9 1
Copy
输出数据 2
30
Copy
提示
两个点(x_1, y_1)(x1,y1)、(x_2, y_2)(x2,y2)之间距离的平方是(x_1-x_2)^2+(y_1-y_2)^2(x1−x2)2+(y1−y2)2。
两套系统工作半径r_1,r_2r1,r2的平方和,是指 r_1,r_2r1,r2 分别取平方后再求和,即 r_1^2+r_2^2r12+r22。
【样例 11说明】
样例11中要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为1818和00。
【样例22 说明】
样例22中的导弹拦截系统和导弹所在的位置如下图所示。要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为2020 和1010。
【数据范围】
对于10\%10%的数据,N = 1N=1
对于20\%20%的数据,1 ≤ N ≤ 21≤N≤2
对于40\%40%的数据,1 ≤ N ≤ 1001≤N≤100
对于70\%70%的数据,1 ≤ N ≤ 10001≤N≤1000
对于100\%100%的数据,1 ≤ N ≤ 1000001≤N≤100000,且所有坐标分量的绝对值都不超过10001000。
NOIP 2010 普及组 第三题
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 100006, inf = 10000000;
struct T{
int x;
int y;
int a;
int b;
}t[M];
int x_1, y_1, x_2, y_2;
int n;
int cmp(T a, T b){
return a.a>b.a;
}
int main(){
cin>>x_1>>y_1>>x_2>>y_2;
cin>>n;
for(int i = 1; i<=n; i++){
cin>>t[i].x;
cin>>t[i].y;
t[i].a = (t[i].x - x_1)*(t[i].x-x_1) + (t[i].y-y_1)*(t[i].y-y_1);
t[i].b = (t[i].x - x_2)*(t[i].x-x_2) + (t[i].y-y_2)*(t[i].y-y_2);
}
sort(t+1, t+n+1, cmp);
int r2 = 0, ans = inf;
for(int i = 1; i<=n; i++){
r2 = max(t[i-1].b, r2);
ans = min(ans,t[i].a+r2);
}
cout<<ans<<endl;
return 0;
}