P1158 导弹拦截
HUGOXM
·
·
题解
##珍爱生命,远离抄袭####
#include<bits/stdc++.h>
using namespace std;
int X1,Y1,X2,Y2,n=0,minn,r,x,y;
//int x[1000009]={0},y[1000009]={0};
struct data//一个函数。
{
int r1,r2;
}a[12345667];
bool cmp(data a,data b)//判断函数。
{
return a.r1>b.r1;//判断那个大。
}
int main()
{
cin>>X1>>Y1>>X2>>Y2>>n;//输入拦截系统的坐标等。
for(int i=1;i<=n;i++)
{
cin>>x>>y;//输入导弹的坐标。
a[i].r1=(X1-x)*(X1-x)+(Y1-y)*(Y1-y);
//求出第a【i】个点与发射器1的距离半径.
a[i].r2=(X2-x)*(X2-x)+(Y2-y)*(Y2-y);
//求出第a【i】个点与发射器2的距离半径.
//X1,Y1是第一个拦截系统的坐标。 X2,Y2是第二个拦截 系统的坐标。
}
sort(a+1,a+n+1,cmp);
//对每个导弹到第一个拦截系统的距离排序。
int i=2,rr1=a[1].r1,rr2=0;
//“i”是计次用的,“rr1”是导弹到第一个拦截系统的距离 (半径)。
/*“rr2”是导弹到第二个拦截系统的距离(半径),但此时还 没用到第二个拦截系统,
所以为“0”。*/
minn=rr1+rr2;//最小半径值。
while(i<=n)
{
rr2=max(rr2,a[i-1].r2 );
//对“rr2”“a[i-1].r2”比较大小,大的赋值给“rr2”.
/*MAX的用处就是把 max(a,b )中的a与b比较,选择大 的。
这个函数与“min”同在#include<bits/stdc++.h>头文 件中。*/
rr1=a[i].r1 ;
minn=min(minn,rr1+rr2);
//在“minn”“rr1+rr2”中找最小的代价。
/*“rr1”“rr2”与先前的最小代价比较,取最小的。
相当于if((rr1+rr2)<minn)minn=rr1+rr2;
/*“min(minn,rr1+rr2)”的用处就是把 minn(a,b )中 的a与b比较,选择小的。
这个函数与“MAX”同在#include<bits/stdc++.h>头 文件中。 */
i++;//i++。
}
cout<<minn; //打印最小代价。
return 0;
}