解題思路:
貪心法
(1)將x軸上可覆蓋雷達的區間算出,按照左端點遞增排序
(2)每次將雷達放置在區間的右端點
(3)當下一個區間的左端點在雷達左側,檢查右端點
----a. 若右端點在雷達左側,將雷達放在右端點
----b. 若右端點在雷達右側,不必更新
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
struct island
{
double x,y;
double left,right;
};
island v[1010];
int cmp(const void * a,const void * b)
{
if(((island*)a)->left>((island*)b)->left)
return 1;
return 0;
}
int main()
{
int n,d;
bool flag;
int c = 0;
while(cin>>n>>d)
{
if(n==0 && d==0)
break;
c++;
flag = true;
for(int i=0;i<n;i++)
{
cin>>v[i].x>>v[i].y;
if(v[i].y > d)
flag = false;
else
{
v[i].left = v[i].x - sqrt(d*d - v[i].y*v[i].y);
v[i].right = v[i].x + sqrt(d*d - v[i].y*v[i].y);
}
}
//無解
if(flag == false)
{
cout<<"Case "<<c<<": "<<-1<<endl;
continue;
}
//有解
qsort(v,n,sizeof(v[0]),cmp);
int m=1;
double r;
r=v[0].right;
for(int i=1;i<n;i++)
{
//把雷達放在區間右側
if(v[i].left>r)
{
m++;
r=v[i].right;
}
//左移雷達覆蓋新區間
else
{
if(v[i].right<r)
r=v[i].right;
}
}
cout<<"Case "<<c<<": "<<m<<endl;
}
return 0;
}