NYOJ-287 Radar

来源:互联网 发布:淘宝购买失败同一时间 编辑:程序博客网 时间:2024/06/05 20:33

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 21 2-3 12 11 20 20 0
样例输出
Case 1: 2Case 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.}

0 0