• 洛谷P1158 导弹拦截 排序


    ---恢复内容开始---

    洛谷P1158 导弹拦截
    排序 算是有技巧的枚举吧

    题意 用两套系统来拦截导弹,一个系统的费用等于这个系统拦截的导弹中离他最远的那颗导弹
    和系统的距离 的平方

    排序 将每颗导弹按距离系统1 的距离排序,
    然后枚举n--0 选这些导弹为系统1最远能够拦截的导弹
    然后就可以更新下一次 系统2要拦截的导弹 中离系统2 最远的一颗

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <string>
     6 #include <algorithm>
     7 #include <iomanip>
     8 #include <iostream>
     9 using namespace std ;
    10 
    11 const int maxn = 100011,inf = 1e9 ; 
    12 struct node{
    13     int x,y,r1,r2 ;  
    14 };
    15 int n,xs,ys,xt,yt,r1,r2,ans ; 
    16 node a[maxn] ; 
    17 
    18 inline bool cmp(node a,node b) 
    19 {
    20     return a.r1 < b.r1 ; 
    21 }
    22 
    23 inline int sqr(int x) 
    24 {
    25     return x*x ; 
    26 }
    27 
    28 int main() 
    29 {
    30     scanf("%d%d%d%d",&xs,&ys,&xt,&yt) ; 
    31     scanf("%d",&n) ;
    32     for(int i=1;i<=n;i++) 
    33     {
    34         scanf("%d%d",&a[ i ].x,&a[ i ].y) ;  
    35         a[ i ].r1 = sqr(a[ i ].x-xs) + sqr(a[ i ].y-ys) ; 
    36         a[ i ].r2 = sqr(a[ i ].x-xt) + sqr(a[ i ].y-yt) ; 
    37     }
    38     sort(a+1,a+n+1,cmp) ; 
    39     r2 = 0 ;
    40     ans = inf ; 
    41     for(int i=n;i>=0;i--) 
    42     {
    43         if( a[ i ].r1 + r2 < ans ) ans = a[ i ].r1 + r2 ;   //  r2  为系统2的费用  
    44         if( a[ i ].r2 > r2 ) r2 = a[ i ].r2 ;   
    45         //  更新 下一次系统2 要拦截的 导弹中距离 系统最远的那一颗 
    46     }
    47     printf("%d
    ",ans) ; 
    48     return 0 ; 
    49 }

    ---恢复内容结束---

  • 相关阅读:
    阅读笔记《梦断代码》其一
    第一次冲刺(第九天)
    第一次冲刺(第八天)
    第一冲刺阶段(第七天)
    第一冲刺阶段(第六天)
    第一冲刺阶段(第五天)
    MySQL数据库半同步复制
    MySQL事物
    MySQL字符编码
    MySQL用户授权
  • 原文地址:https://www.cnblogs.com/third2333/p/6914993.html
Copyright © 2020-2023  润新知