题目:
![](https://i-blog.csdnimg.cn/blog_migrate/f6ffe515205096387436c13c7449b0ed.jpeg)
Figure A Sample Input of Radar Installations
题意:
在x轴上某些位置装雷达,问怎么才能使海岛p被信号覆盖,有n个海岛,雷达覆盖范围是d。
分析:
考虑一个海岛p,对于覆盖它的雷达放的最优的位置是它在圆圈的边缘上,因为这样这个雷达就可以覆盖更多其他的海岛。那么先按x排序,对于当前的一个圈,看看是否下一个海岛是否可以在圈内,如果可以就在看下一个,不可以就放一个最新的雷达,接下来在比较后面的海盗是否可以放到这个圈内。
需要注意一种情况,就是对于第i个海岛放的雷达不可以覆盖第i+1个海岛,而第i+1个海岛放的雷达可以覆盖第i个海岛的情况,这种情况,雷达要放在可以覆盖第i+1个海岛的那个位置了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1009;
int d,n;
struct point
{
int x,y;
};
point p[N];
bool cmp(const point& a,const point& b){return a.x<b.x;}
double getx(point a){
return a.x+sqrt(1.0*d*d-1.0*a.y*a.y);
}
int main()
{
int cas=0;
while(~scanf("%d%d",&n,&d)&&(n+d)){
bool flag=0;
for(int i=0;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
if(p[i].y>d)flag=1;
}
if(flag){
printf("Case %d: -1\n",++cas);continue;
}
sort(p,p+n,cmp);
double x=getx(p[0]);
int ans=1;
for(int i=1;i<n;i++){
double tmp=getx(p[i]);
if(p[i].x<x&&x>tmp){
x=tmp;continue;
}
if(p[i].y*p[i].y+(p[i].x-x)*(p[i].x-x)<=d*d)continue;
//if(p[i].y*p[i].y+(p[i].x-x)*(p[i].x-x)<=d*d)continue;
x = getx(p[i]);
ans++;
}
printf("Case %d: %d\n",++cas,ans);
}
return 0;
}