洛谷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\n",ans) ; 
48     return 0 ; 
49 }

 

 

 

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

posted @ 2017-05-28 08:35  third2333  阅读(337)  评论(0编辑  收藏  举报