题目大意:x轴为河岸,给出小岛坐标,在河岸上建探测范围一定雷达,要求覆盖所有小岛,求雷达的最小个数。
分析:以小岛为圆心,探测半径画圆,与x轴交于ai,bi,求出所有区间并排序,如果两个区间有重叠,则可覆盖,将bi更新为b(i-1)即可。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct xy
{
int x;
int y;
}point[1000];
struct l
{
double begin;
double end;
}length[1005];
int cmp(l a, l b)
{
return a.begin < b.begin;
}
int main()
{
int n, k,num=0;
while (scanf("%d%d", &n, &k) != EOF&&n&&k)
{
int sum = 1,flag=0;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &point[i].x, &point[i].y);
}
for (int i = 0; i < n; i++)
{
if (k < abs(point[i].y))
{
flag = 1;
break;
}
double t = sqrt(k*k*1.0- point[i].y*point[i].y*1.0);
length[i].begin = point[i].x *1.0- t;
length[i].end = point[i].x*1.0 + t;
}
if (flag == 1)
{
printf("Case %d: -1\n", ++num);
continue;
}
sort(length, length + n, cmp);
for (int i = 0; i < n - 1; i++)
{
if (length[i].end >= length[i + 1].begin)
{
length[i + 1].end = length[i].end;
continue;
}
sum++;
}
num++;
printf("Case %d: %d\n", num,sum);
}
return 0;
}