Radar Installation
总时间限制:
1000ms
内存限制:
65536kB
描述
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.
Figure A Sample Input of Radar Installations
输入
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.思路:
给出一个点,然后根据半径找到这个点左右区间。计算出所有的区间,然后将所有的区间按照起始点递增的顺序排序,最后将区间合并处理。
1.1如果后一个的左区间大于前一个的右区间,雷达数++,更新区间为当前区间
1.2如果后一个的右区间小于前一个的右区间,更新右区间即可,因为可以覆盖。
2.为什么以左区间为临界点???(正如下面图片中所显示,第四条线段的起点并不能覆盖前三条,所以应该在第三条的起点处放置雷达。这也就是,为什么用左端点排序的原因)
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
struct node
{
double zuo,you;
bool operator<(const node &no)const
{
return zuo<no.zuo;
}
}no[1006];
int main()
{
int n;
double r;
int cnt=0;
while(scanf("%d %lf",&n,&r)!=EOF)
{
cnt++;
int fz=0;
if(n==0||r==0) break;
for(int i=0;i<n;i++)
{
double a,b;
cin>>a>>b;
if(b>r)
{
fz=1;
continue;
}
no[i].zuo=a-sqrt(r*r-b*b);
no[i].you=a+sqrt(r*r-b*b);
}
if(fz)
{
printf("Case %d: -1\n",cnt);
}
else
{
sort(no,no+n);
int sum=1;
double left=no[0].zuo,right=no[0].you;
for(int i=1;i<n;i++)
{
if(no[i].zuo>right)//并不能将前一个区间覆盖,此时雷达数加一,区间变为当前区间
{
sum++;
left=no[i].zuo;
right=no[i].you;
}
else if(no[i].you<right) //可以将前一个区间覆盖,右区间更新即可
right=no[i].you;
}
printf("Case %d: %d\n",cnt,sum);
}
}
return 0;
}