B - Radar Installation
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
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
Input
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
The input is terminated by a line containing pair of zeros
Output
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.
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
题意:给出岛屿的坐标和雷达的辐射范围,在x轴上求出能够将所有岛屿覆盖所需的最小雷达数,若不能完成则输出-1。
题解:求出各个岛屿到x轴的距离,再由此求出在x轴上可行的范围,再将范围排序,从左到右安放雷达,当下一个范围的左界大于雷达安放的坐标,则需要再增加一个雷达在这个范围的右界。若下一个范围的右界大于雷达安放的坐标,则将该雷达移动至右界,数量不变,若小于雷达安放的坐标,则雷达的位置和数量都不变,继续下一个范围的判断。
注意:一定一定要注意用double。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 2500;
int ans = 0;
typedef struct NODE
{
double l;
double r;
}node;
bool cmp(node a,node b)
{
if(a.l == b.r)
{
return a.r < b.r;
}
return a.l < b.l;
}
void solve(int n,node node[])
{
double sign = -1000000000;
int i;
for(i = 0;i < n;i++)
{
if(node[i].l > sign)
{
ans++;
sign = node[i].r;
}
else
{
if(node[i].r < sign)
{
sign = node[i].r;
}
}
}
}
int main()
{
node node[maxn];
int n,d;
int flag;
int i;
int count = 0;
double x[maxn],y[maxn];
while(scanf("%d%d",&n,&d) != EOF)
{
if(!n && !d) break;
ans = 0;
flag = 1;
count++;
for(i = 0;i < n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
if(y[i] > d)
{
flag = 0;
}
}
if(!flag)
{
printf("Case %d: %d\n",count,-1);
}
else
{
double z;
for(i = 0;i < n;i++)
{
z = sqrt(d * d * 1.0 - y[i] * y[i]);
node[i].l = x[i] - z;
node[i].r = x[i] + z;
}
sort(node,node + n,cmp);
solve(n,node);
printf("Case %d: %d\n",count,ans);
}
}
return 0;
}