Radar Installation

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=27586

题意:

       在海岸线上摆放雷达并限定雷达覆盖半径d,再以海岸线为轴,给定海上岛屿坐标,求至少需要多少雷达可以覆盖所以岛屿,如果不能输出'-1'。

案例:

        Sample Input

        3 2

        1 2

        -3 1

     2 1

        1 2

        0 2

        0 0

        Sample Output     

  Case 1: 2
  Case 2: 1

分析:

        可以转换为区间覆盖问题。以岛屿为圆心,雷达扫射半径为半径,求出此圆与x轴(即海岸线)交点坐标,两交点坐标间即为雷达摆放区间(包括两交点(在此区间任意位置摆放雷达均可覆盖岛屿))。接下来即为区间覆盖求解问题了。

源代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,num;
 6 struct former
 7 {
 8     double l;
 9     double r;
10 }a[1005];
11 double cmp(former m,former t)//区间排序
12 {
13     if(m.r==t.r) return m.l>t.l;
14     else 
15         return m.r<t.r;
16 }
17 void change()//计算所需雷达
18 {
19     int k=0;
20     sort(a,a+n,cmp);
21     for(int j=1;j<n;j++)
22     {
23         if(a[j].l>a[k].r)
24         {
25             num++;
26             k=j;
27         }
28     }
29 }
30 int main()
31 {
32     int cnt=0;
33     double x,y,d;
34     while(scanf("%d%lf",&n,&d)&&n&&d)
35     {
36         num=1;
37         for(int i=0;i<n;i++)
38         {
39             scanf("%lf%lf",&x,&y);
40             if(d<y||d<0)//判断是否有岛屿超出雷达覆盖范围
41                 num=-1;
42              a[i].l=x-sqrt(d*d-y*y);//岛屿转换可摆放雷达区间
43             a[i].r=x+sqrt(d*d-y*y);
44         }
45         if(num==-1)
46             printf("Case %d: -1
",++cnt);
47         else
48         {
49             change();
50             printf("Case %d: %d
",++cnt,num);
51         }
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/huaszjh/p/4719074.html