讲解:不再以雷达为中心找能最大覆盖岛屿的面积,而是一岛屿为中心,一最大距离d为半径找这个岛屿如果想要被覆盖,雷达所能在的位置区间。
把n个区间按照左边的大小排序,我们比较右边的大小来找有多少个独立的区间,独立区间的个数就是需要雷达的个数。(记住公共区间需要缩小区间范围(当存在包含关系的时候要更新比较区间max的大小))
这种题存在double 浮点型的题一定要仔细,double和int类型在比较的时候会丢失精度出错率极大
重点是还不好找错。我交了n遍了一直wwwwww很扎心的!
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct qujian{
double s;
double e;
}q[1005];
int c=0;
int cmp(qujian a,qujian b)
{
return a.s<b.s;
}
int main()
{
int n,d,sum,flag,y;
double x;
while(~scanf("%d%d",&n,&d)&&n+d)
{
int i,j;
flag=0;
if(d<=0)flag=1;
for(i=0;i<n;i++)
{
scanf("%lf%d",&x,&y);
if(fabs(y)<=d)
{
double r=sqrt(double(d*d-y*y));
q[i].s=x-r;
q[i].e=x+r;
}
else //区间问题
flag=1;
}
if(flag)
{
printf("Case %d: -1\n",++c);
continue;
}
sort(q,q+n,cmp);
double max=q[0].e;
sum=1;
for(i=0;i<n;i++)
{
if(q[i].s>max)//不存在公共部分
{
sum++;
max=q[i].e;
}
else//存在公共部分
{
if(q[i].e<max)//属于包含关系得时候要缩小公共区间的范围
max=q[i].e;
}
}
printf("Case %d: %d\n",++c,sum);
}
return 0;
}