p1158题解

· · 题解

这道题是NOIP的第三题 只要你这道题做出来 一等奖就差不多了。 首先先用排序排出离第一发射台的距离,再枚举。 自然就出来了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct ab
{
    int x,y,j1,j2;//X,Y为坐标,J1为到一号导弹发射台的距离,J2为到二号导弹发射台的距离。
}a[100005];
bool cmp(ab a,ab b)//简单的结构体CMP
{
    return a.j1<b.j1;
}
int main()
{
    int x1,x2,y1,y2,j1,j2,minab=0,n,x,y,maxb=0;
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a[i].x,&a[i].y);
    }
    for(int i=0;i<n;i++)//计算距离
    {
        a[i].j1=(a[i].x-x1)*(a[i].x-x1)+(a[i].y-y1)*(a[i].y-y1);
        a[i].j2=(a[i].x-x2)*(a[i].x-x2)+(a[i].y-y2)*(a[i].y-y2);
    }
    sort(a,a+n,cmp);//简单排序
    minab=a[n-1].j1;
    for(int i=1;i<n;i++)
    {
        x=a[n-i-1].j1;
        y=a[n-i].j2;
        if(y>maxb)maxb=y;//比较一下二号发射台谁的导弹半径大
        if((x+maxb)<minab)minab=x+maxb;
    }
    printf("%d",minab);//输出相加
}