雷达装置 (POJ 1328)题解

【问题描述】

建立一个直角坐标系,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.
时间: 2024-10-06 16:42:37

雷达装置 (POJ 1328)题解的相关文章

Poj 1328(雷达安装)几何+贪心

[题目描述]: 给定n个小岛以及这些小岛的位置,并输入雷达的辐射面积,问最少需要多少个雷达站才能覆盖所有小岛? [思路分析]: 本题首先想到的是运用贪心算法,但是算法想到了如何贪心?这道题我自己开始做之时只有一点思路,就是让每一个雷达覆盖较多的点,但是如何较多覆盖,这就是典型的数学问题了,自己没有思索出来,最后在网上看了题解才明白如何做.下面我们看看如何建图: 我们通过这个图首先运用了一个数学知识,就是以小岛为圆心,雷达辐射范围为圆心建立一个圆,该圆与x轴有一个交点,以该交点作为雷达站铺设点那么

POJ 1328 Radar Installation 贪心题解

本题是贪心法题解,不过需要自己观察出规律,这就不容易了,很容易出错. 一般网上做法是找区间的方法. 这里给出一个独特的方法: 1 按照x轴大小排序 2 从最左边的点循环,首先找到最小x轴的圆 3 以这个圆判断可以包括右边的多少个圆,直到不可以包括下一个点,那么继续第2步,画一个新圆. 看代码吧,应该很清晰直观的了. 效率是O(n),虽然有嵌套循环,但是下标没有重复,一遍循环就可以了,故此是O(n). #include <stdio.h> #include <cmath> #incl

POJ 1328 Radar Installation 雷达安装 贪心问题求解

题目链接: POJ 1328 Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coas

POJ 1328 Radar Installation(贪心)

http://poj.org/problem?id=1328 题意: 假设滑行是无限直线.土地在海岸的一边,海在另一边.每个小岛是位于海边的一个点.位于海岸上的任何雷达装置只能覆盖距离,所以如果两者之间的距离最大为d,则海中的岛屿可以被半径装置覆盖. 我们使用笛卡尔坐标系,定义惯性是x轴.海侧在x轴之上,陆侧在下.考虑到每个岛屿在海洋中的位置,并且考虑到雷达装置的覆盖距离,您的任务是编写一个程序,以找到覆盖所有岛屿的最少数量的雷达装置.注意,岛的位置由其xy坐标表示. 思路: 由于雷达只能处于x

[2016-02-04][POJ][1328][Radar Installation]

[2016-02-04][POJ][1328][Radar Installation] Radar Installation Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Submit Status Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in

POJ 1328:Radar Installation

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50843   Accepted: 11415 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point loca

Poj 1328 Radar Installation 贪心

题目链接:http://poj.org/problem?id=1328 Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52768   Accepted: 11867 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the othe

[ACM] POJ 1328 Radar Installation (贪心,区间选点问题)

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51131   Accepted: 11481 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point loca

POJ 1328、Radar Installation 贪心

jQuery的属性操作非常简单,下面以一个a元素来说明属性的获取/设置/删除操作 <body> <a>jquery.com</a> </body> 添加属性 $('a').attr('href', 'http://www.jquery.com') 添加多个属性 $('a').attr({'href':'http://www.jquery.com', 'title':'jquery.com'}) 获取属性 $('a').attr('href') class属性