//贪心题,所谓贪心只是一个思想,没有特定的解法,只是单纯地找出当前最多的解,能多就多,最后企图达到整体的最优,这就是贪心。
//这道题是说有一个x轴作为海岸分界线,上方是海,有一个个的海岛,下方是陆地,有一个雷达,扫描范围是半径为d的圆,只能安装在x轴上,问最少要安装多少个雷达?
//如图,首先是只要明确A和B点有什么意义,这道题就能很快解答,以A和B点做圆心,d为半径就刚好交C点,所以A到B是一个区间范围,在[A,B]上建圆就可以把C给概括起来(易证),然后整道题目就变成了区间包围问题;把每个点的这两个左右点都算出来,按左点进行排序,然后更新左右区间,见代码(l和r),只要两个区间有公共范围,就可以用一个雷达把他们都罩起来;
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 7 struct point{ 8 double left; 9 double right; 10 }p[1010]; 11 12 bool cmp(point a, point b){ 13 return (a.left < b.left); 14 } 15 16 int main() 17 { 18 int n, d, res, tcase = 0; 19 while(cin >> n >> d && (n || d)){ 20 bool flag = false; 21 for(int i = 0; i < n; i++){ 22 double x, y; 23 scanf("%lf%lf", &x, &y); 24 if(y > d) 25 flag = true; 26 else{ 27 p[i].left = x-sqrt(d*d-y*y); 28 p[i].right = x+sqrt(d*d-y*y); 29 } 30 } 31 printf("Case %d: ", ++tcase); 32 if(flag) 33 printf("-1\n"); 34 else{ 35 sort(p,p+n,cmp); 36 res = 1; 37 double l = p[0].left, r = p[0].right; 38 for(int i = 1; i < n; i++){ 39 if(r < p[i].left){ 40 res++; 41 r = p[i].right; 42 } 43 else if(r > p[i].right) 44 r = p[i].right; 45 l = p[i].left; 46 } 47 printf("%d\n", res); 48 } 49 } 50 return 0; 51 }
时间: 2024-10-08 09:23:01