原文:https://blog.csdn.net/ac_gibson/article/details/44410041
题目大意:海中有n个岛屿,现在想要在海岸线上装设雷达来探测这些岛屿(海岸线相当于x轴,岛屿都在x轴的上方),雷达的探测范围是一个半径为d的圆,已知n个岛屿的坐标,问你最少需要多少雷达才能探测到全部岛屿;如果不能探测到全部岛屿,输出“ -1 ”。
Sample Input
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
2
1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct date //用来储存之后的左右坐标
{
double l;
double r;
}loc[100];
int cmp(const void*a,const void*b)
{
return (*(date*)a).l-(*(date*)b).l;
}
int main()
{
int n,d;
while(scanf("%d %d",&n,&d))
{
if(n==0&&d==0)break;
int x[100],y[100];
int i;
for(i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
for(i=0;i<n;i++)
{
if(y[i]>d){printf("-1");return 0;}//y比d大则不可能存在雷达满足条件
else
{
double t=sqrt(d*d-y[i]*y[i]);//此处思路是,当两个圆的弦有交点,
loc[i].l=x[i]-t; 则在交点区间内,都可做圆覆盖岛屿
loc[i].r=x[i]+t;
}
}
qsort(loc,n,sizeof(loc[0]),cmp);//按左端点排序
int j=0;
int num=1;
for(i=1;i<n;i++)
{
if(loc[i].l>loc[j].r)//当两个圆不相交,多一个雷达
{
num++;
j=i;
}
else if(loc[i].r<loc[j].r)//当第二个圆的弦被包含在第一个圆,
{ 则取第二个圆的右端点(取比较小的一个圆的范围)
j=i; 因为我们要是雷达覆盖两个圆
}
}
printf("%d",num);
return 0;
}
}