P1158 导弹拦截

· · 题解

##珍爱生命,远离抄袭####

#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;
}