码迷,mamicode.com
首页 > 其他好文 > 详细

雷达装置 (POJ 1328)题解

时间:2015-05-08 09:18:24      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

【问题描述】

     建立一个直角坐标系,x轴下方为陆地,上方为海洋,在海洋中有n个岛屿,我们需要在x轴上建立若干个雷达装置,每个雷达装置的监测半径为h,问最少需要多少雷达?(输入中将有多组数据,每组数据间有一行空着,最后用一行0 0表示输入结束,你的任务是对于每组数据,求出最少需要的雷达数,若有岛屿无法被监测到,输出-1)

【样例输入】   

    3 2

    1 2

   -3 1

    2 1

 

    1 2

    0 2

   

    0 0

【样例输出】 

    Case 1: 2

    Case 2: 1

【解题思路】

    这题为贪心题,看到题目,不难想到,如果在岛屿正下方的雷达监测不到岛屿,那该岛屿必定是监测的不到的,在读完该组数据后输出-1即可。因此,对于每一个岛屿,我们以h为半径画圆,如果与x轴没有交点,则该岛无法被监测到,否则,将其与x轴的两个交点存入数组a,b。在所有交点存入数组后,以每个岛的左边的交点为关键字排序。设置一个变量r,为雷达的位置,将排序后的b[1]赋值给r,从第二个岛屿开始找,如果第二个岛屿的靠左的交点在r的监测范围之外,则将雷达数+1,将第二个岛屿靠右的交点赋值给r,如果第二个岛屿的靠右的交点在r的监测范围之内,直接将b[2]赋值给r;依此类推。

【代码实现】

 

 1 var i,j,n,d,x,y,num,ans:longint;
 2     xx,r:double;
 3     f:boolean;
 4     a,b:array[1..1000] of double;
 5 procedure sort(l,r: longint);
 6       var
 7          i,j: longint;
 8          x,y:double;
 9       begin
10          i:=l;
11          j:=r;
12          x:=a[(l+r) div 2];
13          repeat
14            while a[i]<x do
15             inc(i);
16            while x<a[j] do
17             dec(j);
18            if not(i>j) then
19              begin
20                 y:=a[i];
21                 a[i]:=a[j];
22                 a[j]:=y;
23                 y:=b[i];
24                 b[i]:=b[j];
25                 b[j]:=y;
26                 inc(i);
27                 dec(j);
28              end;
29          until i>j;
30          if l<j then
31            sort(l,j);
32          if i<r then
33            sort(i,r);
34       end;
35 begin
36  readln(n,d);
37  while n<>0 do
38   begin
39    f:=true;
40    inc(num);//增加数据数
41    for i:=1 to n do
42     begin
43      readln(x,y);
44      if y>d then//判断是否有无论雷达在哪都监测不到的岛屿
45       begin
46        f:=false;
47        continue;
48       end;
49      xx:=sqrt(sqr(d)-sqr(y));
50      a[i]:=x-xx;b[i]:=x+xx;//用勾股定理求与x轴的交点
51     end;
52    if not(f) then
53     begin
54      writeln(Case ,num,:, ,-1);
55      readln(n,d);
56      continue;
57     end;//存在雷达监测不到的点,输出-1,读入下一组数据
58    sort(1,n);//排序
59    r:=b[1];
60    ans:=1;
61    for i:=2 to n do//一个个比较
62     begin
63      if a[i]>r then//若不在范围雷达数+1
64       begin
65        inc(ans);
66        r:=b[i];
67       end;
68      if b[i]<r then//若在,直接赋给r
69       r:=b[i];
70     end;
71    writeln(Case ,num,:, ,ans);
72    readln(n,d);//读入下一组数据
73   end;
74 end.

 

雷达装置 (POJ 1328)题解

标签:

原文地址:http://www.cnblogs.com/PengBoLiuXu/p/4486680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!