2010 NOIP 普及组 第3题 导弹拦截

LG-P1158 导弹拦截 (NOIP2010)

分析:

这题不难,思路是:
先把每一个导弹对应的两个系统的距离平方值存储在结构数组sum的s1和s2里,然后按照其中一个的值进行排序,从已排序的序列最大值开始扫。初始情况是所有导弹归s1管。把扫过的导弹归s2管,然后求出作战半径平方和,因为不用输出最小值的具体哪个导弹归哪个系统管,直接擂台法比出最小值即可。
 
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxN = 100000+5;
struct node
{
    int x,y;
}s1,s2,m[maxN];
struct struct_node
{
    int s1,s2;
}sum[maxN];
int n;
int comp(struct_node a,struct_node b)
{
    return a.s1<=b.s1;
}
int main()
{
    cin >> s1.x >> s1.y >> s2.x >> s2.y;
    cin >> n;
    for (int i=1;i<=n;i++)
    {
        cin >> m[i].x >> m[i].y;
    }
    for (int i=1;i<=n;i++)
    {
        sum[i].s1=abs(m[i].x-s1.x)*abs(m[i].x-s1.x)+abs(m[i].y-s1.y)*abs(m[i].y-s1.y);
        sum[i].s2=abs(m[i].x-s2.x)*abs(m[i].x-s2.x)+abs(m[i].y-s2.y)*abs(m[i].y-s2.y);
    }
    sort(sum+1,sum+n+1,comp);
    int min=sum[n].s1,max=-1;
    for (int i=n;i>=1;i--)
    {
        if (sum[i].s2>max)
        {
            max=sum[i].s2;
        }
        if (sum[i-1].s1+max<min)
        {
            min=sum[i-1].s1+max;
        }
    }
    cout << min << endl;
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/OIerPrime/p/7674641.html