P1158 导弹拦截

传送门

只有两个拦截系统

第一个拦截系统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;
}
原文地址:https://www.cnblogs.com/iss-ue/p/12622501.html