只有两个拦截系统
第一个拦截系统A拦截离自己较近的一些导弹,剩下的交给第二个拦截系统B。
那我们可以枚举A拦截下的导弹集合(把导弹按照距离A的距离排序)
那么排序后,假设A能拦截下前i个导弹,那么后面n-i个导弹由B来完成
枚举后面的n-i个导弹,找出距离B的最大值即可。
然后上述步骤可以从后往前取B的最大距离预处理掉。
#include <iostream>
#include <algorithm>
using namespace std;
struct p{
int x,y;
int q,w;
}d[100009];
bool com(p a,p b){
return a.q<b.q;
}
int intw[100009];
int main()
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>d[i].x>>d[i].y;
d[i].q=(x1-d[i].x)*(x1-d[i].x)+(y1-d[i].y)*(y1-d[i].y);
d[i].w=(x2-d[i].x)*(x2-d[i].x)+(y2-d[i].y)*(y2-d[i].y);
}
sort(d+1,d+1+n,com);
for(int i=n;i>=1;i--)
intw[i]=max(intw[i+1],d[i].w);
int ans=999999999;
for(int i=0;i<=n;i++)
ans=min(d[i].q+intw[i+1],ans);
cout<<ans;
}