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;
}
导弹拦截策略:分段贪心算法在坐标拦截中的应用
584

被折叠的 条评论
为什么被折叠?



