如今我们位于沿海地区,需要安装大炮,使得火力可以覆盖整个区域。海岸线可以视为是无限长的直线。陆地位于海岸线的一侧,海洋位于另一侧。海洋里有若干个岛屿,每个小岛可以视为海洋中的一个点。我们需要在海岸线上安装大炮,每个大炮智能覆盖距离d,因此海洋中的小岛被大炮安装所覆盖的条件是两者间的距离不超过 d 。 我们将海岸线视为 x 轴。海洋的一侧位于 x 轴上方,陆地的一侧位于下方。给定海洋中每个小岛的位置(以xy坐标给出),并给定大炮的覆盖距离,你需要写程序,找出安装大炮的最少数量,使得所有的小岛都被覆盖。

Input
输入由多个测试用例组成。每个测试用例的第一行,包含了两个整数 n (1<=n<=1000) 和 d,其中 n 是海洋中小岛的数目,d 是大炮可以覆盖的距离。接下来是 n 行,每行包含了两个整数,表示每个小岛的坐标。每组测试用例之间,以一个空行间隔。

输入终止于包含两个 0 的一行。

Output
对于每个测试用例,输出一行,包括测试用例的编号,以及安装大炮所需的最小数量。如果不能全部覆盖,则输出"-1"。
Sample Input

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

Case 1: 2
Case 2: 1

解题报告:
这道题太看细节了,,debug了一个小时,1是d和y可能是相反数,所以不能t=dd-yy t<0来判断d是不是真的小于y 2:我们以左端点排序,如果当前的最远的距离比枚举的左端点大的时候,如果它超出了右端点,那么就应该用右端点的值,不然就不能覆盖这一次的雷达了。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h> 
using namespace std;
const	int N=1010;
struct node{
	double l;
	double r;
}q[N];
bool cmp(node a,node b)
{
	return a.l<=b.l;
}
int main()
{
	int kk=0;
	int n;
  double d;
	while(cin>>n>>d&&n&&d)
	{
		bool flag=true;
		for(int i=0;i<n;i++)
		{
			double  x,y;
			cin>>x>>y;
			double t=d*d-y*y;
			if(d<y)
			{
				flag=false;
				continue;
			}
			else
			{q[i].l=x-sqrt(t);
			q[i].r=x+sqrt(t);
			}
		}
		int cntt;
		if(flag)
		{	
		sort(q,q+n,cmp);
		double last=q[0].r;
		cntt=1;
		for(int i=1;i<n;i++)
		{
			if(q[i].l>last)
			{
				cntt++;
				last=q[i].r;
			}
			else	if(q[i].r<last)
			last=q[i].r;
		}
		cout<<"Case "<<++kk<<": "<<cntt<<endl;
		}
		else
		cout<<"Case "<<++kk<<": "<<"-1"<<endl;
		}
	return 0;
}