---恢复内容开始---
洛谷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 }
---恢复内容结束---