1158 导弹拦截

导弹拦截策略:分段贪心算法在坐标拦截中的应用

1158 导弹拦截

这个题是第一个导弹拦截题目的11年后,所以,题目也运用了11年后
这个题貌似有点绿色了,涉及到平面坐标的问题,这一类问题我们练习过,有点生疏
这一次的问题就是来比较坐标,而不是比较高度了
貌似差不多吧
这个题更是一个分段线段贪心,这个知识点很重要,包括今年的j1就是如此,还有啊,一定给要注意弄清变量
其实对于每一个导弹,不是被系统1拦截,就是系统2拦截,所以我们只需要枚举答案就可以了,计算出两个拦截的距离然后进行相比较就好了
几天后的我再次来更新一下
其实对于每一个系统不是被系统1拦截就是被系统2拦截,所以我们可以统一一下,就有些类似于贪心线段类型的题目了
我们按照系统1的拦截范围将所有导弹进行排序,然后,我们再比较一下每一个导弹能不能被导弹2拦截下来,比较最小的半径平方和,也就是最小的代价

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
struct node{
	int dis1,dis2;
}d[100005];
int n,x1,y1,x2,y2;
int rr=0; 
bool cmp(node x,node y)
{
	return x.dis1<y.dis1;
 } 
int main()
{
	cin>>x1>>y1>>x2>>y2;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		cin>>x>>y;
		d[i].dis1=(x-x1)*(x-x1)+(y-y1)*(y-y1);
		d[i].dis2=(x-x2)*(x-x2)+(y-y2)*(y-y2);//计算距离 
	}
	sort(d+1,d+1+n,cmp); //按距离1大的放在后面
	int ans=d[n].dis1;//全部都用1来拦截,所以从最后的开始
	for(int i=n-1;i>=1;i--)//从后面开始一个一个进行拦截 
	{
		if(rr<d[i+1].dis2) rr=d[i+1].dis2;
		ans=min(ans,d[i].dis1+rr);
	 } 
	 cout<<ans<<endl;
	return 0;
 } 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值