简单排序--导弹拦截

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

 题目描述:

经过11年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为0时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。

     某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。

输入描述:

第一行包含4个整数x1、y1、x2、y2,每两个整数之间用一个空格隔开,表示这两套导弹拦截系统的坐标分别为(x1, y1)、(x2, y2)。

第二行包含1个整数N,表示有N颗导弹。接下来N行,每行两个整数x、y,中间用一个空格隔开,表示一颗导弹的坐标(x, y)。不同导弹的坐标可能相同。

输出描述:

输出只有一行,包含一个整数,即当天的最小使用代价。

示例:

输入:

输出:

说明:

输入:

输出:

说明:

备注:

错误的想法:初一看这个题目,我直接就想到了用两个数组A, B保存每个导弹到两个系统的距离,也就是假设导弹到A系统比到B系统近,就把r1存入A中,反之把r2存入B中,然后把A中B中最大的加起来就可以了。两个示例数据过了,但是wa了,因为这种想法是错的,没有考虑到一些情况,并且数据复杂。


题解:

    这一题可以定义一个结构体存导弹的坐标和到两个系统的距离平方r1, r2 然后根据r1从大到小排序,枚举,则存在k使得k+1到n都在第一个系统的拦截范围内,1到k-1则在第二个系统的拦截范围内

#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;
}
复制代码

\

猜你喜欢

转载自juejin.im/post/7087489707084349470
今日推荐