题意:使用雷达覆盖所有的岛屿。给定的是岛屿的个数n和雷达的半径d,n行的坐标(x,y),首先将雷达的区间求出来并排序。然后从左向右看,当发现下一个区间的起始点大于前面所有区间的最小结束点的时候,答案加1.
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1001;
int ans=0;
int n,d;
bool ok;
struct Position
{
int x;
int y;
}position[maxn];
bool operator <(const Position &a,const Position &b)
{
return a.x<b.x;
}
bool operator ==(const Position &a,const Position &b)
{
return (a.x==b.x)&&(a.y==b.y);
}
void init()
{
int i;
ok=true;
for (i=0;i<n;i++)
{
cin>>position[i].x>>position[i].y;
if (position[i].y>d)
{
ok=false;
}
}
}
double getx(Position &position)
{
return position.x+sqrt(double(d*d-position.y*position.y));
}
void work()
{
double x,temp;
int i;
x=getx(position[0]);
ans=1;
for (i=1;i<n;i++)
{
temp=getx(position[i]);
if (x>temp&&x>position[i].x)
{
x=temp;
continue;
}
if ((position[i].x-x)*(position[i].x-x)+(position[i].y*position[i].y)<=d*d)
{
continue;
}
x=getx(position[i]);
ans++;
}
}
int main(int argc,char *argv[])
{
int casenum=0;
while (cin>>n>>d &&n!=0&&d!=0)
{
init();
casenum++;
if (!ok)
{
cout<<"Case "<<casenum<<": -1"<<endl;
continue;
}
sort(position,position+n);
work();
cout<<"Case "<<casenum<<": "<<ans<<endl;
}
return 0;
}