【贪心】雷达问题

题目描述

张琪曼等人用时空雷达定位李旭琳所在的空间位置。如图7.3所示,时空雷达装在一条直线上,直线上方是空间海洋,每个人在空间海洋的位置就如同大海中的岛屿,这些人的位置已知,每一个雷达的扫描范围是一个半径为d的圆形区域,问最少需要多少个雷达覆盖所有的人(岛屿)。

输入

输入包括多组测试数据,每组测试数据第一行为两个整数n (1≤n≤1000) 和 d,即岛屿数和雷达扫描半径。随后n行每行两个整数表示岛屿坐标。每组测试数据以空行间隔,所有测试数据以0 0结束。

输出

输出最少需要安装雷达数,每组一行。若无解以-1表示。

样例输入

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

样例输出

Case 1: 2
Case 2: 1

 

解题思路:该题与上一题异曲同工

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <math.h>
 6 using namespace std;
 7 struct node
 8 {
 9     double l,r;
10 };
11 node a[1005];
12 bool cmp(node a,node b)
13 {
14     return a.r<b.r;
15 }
16 int main()
17 {
18     int n,k=1;
19     int flag;
20     double d;
21     while(cin>>n>>d)
22     {
23         flag=1;
24         if(n==0&&d==0)
25         {
26             break;
27         }
28         double x,y;
29         for(int i=0;i<n;i++)
30         {
31             cin>>x>>y;
32             if(!flag)
33             {
34                 continue;
35             }
36             if(y>d)
37             {
38                 flag=0;
39                 continue;
40             }
41             a[i].l=x-sqrt(d*d-y*y);
42             a[i].r=x+sqrt(d*d-y*y);
43         }
44         printf("Case %d: ", k++);
45         if(!flag)
46         {
47             printf("-1
");
48             continue;
49         }
50         sort(a,a+n,cmp);
51         double temp=-10000;
52         int ans=0;
53         for(int i=0;i<n;i++)
54         {
55             if(temp<a[i].l)
56             {
57                 ans++;
58                 temp=a[i].r;
59             }
60         }
61         cout << ans << endl;
62     }
63 
64     return 0;
65 }
View Code


原文地址:https://www.cnblogs.com/SoulSecret/p/8425981.html