#P1005. [NOIP2010普及组] 导弹拦截

题目描述

经过 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。

#P1005. [NOIP2010普及组] 导弹拦截_第1张图片

【数据范围】

对于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
#include
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<

 

你可能感兴趣的:(算法,c++)