Radar
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
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 coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
-
输入
-
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.
The input is terminated by a line containing pair of zeros
输出
- For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case. 样例输入
-
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
样例输出
-
Case 1: 2 Case 2: 1
算出每个岛到坐标左右最远的距离,转化为区间选点
不知道为啥,加了无满足条件输出-1不给过……
01.
#include<iostream>
02.
#include<algorithm>
03.
#include<cmath>
04.
using
namespace
std;
05.
struct
node
06.
{
07.
double
x,y;
08.
}no[1010];
09.
bool
cmp(node p,node q)
10.
{
11.
return
p.y<q.y;
12.
}
13.
int
main()
14.
{
15.
int
n,sum=1;
16.
double
b,l,r;
//max=-10000.0;
17.
while
(cin>>n>>b&&n&&b)
18.
{
19.
for
(
int
i=0;i<n;i++)
20.
{
21.
cin>>l>>r;
22.
no[i].x=l-
sqrt
(b*b-r*r);
23.
no[i].y=l+
sqrt
(b*b-r*r);
24.
//max=max>r?max:r;
25.
}
26.
sort(no,no+n,cmp);
27.
int
count=1;
28.
double
v=no[0].y;
29.
for
(
int
i=1;i<n;i++)
30.
{
31.
if
(no[i].x>v)
32.
{
33.
v=no[i].y;
34.
count++;
35.
}
36.
}
37.
//if(max>b)
38.
// cout<<"Case "<<sum++<<": "<<-1<<endl;
39.
//else
40.
cout<<
"Case "
<<sum++<<
": "
<<count<<endl;
41.
}
42.
return
0;
43.
}
-
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.