zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    电话续
    邀请
    Detecting versions of IE
    Android命令行
    电话
    性格形容词
    .NET 异常处理
    uva 10161 Ant on a Chessboard
    转载 ACM训练计划
    uva 253 Cube painting
  • 原文地址:https://www.cnblogs.com/OIerPrime/p/7674641.html
Copyright © 2011-2022 走看看