#include<stdio.h>
#include<math.h>
#define scale 1000
#define bool int
#define true 1
#define false 0
void qsort(double s[],double s1[], int l, int r)
{
int i, j;
double x,y;
if (l < r)
{
i = l;
j = r;
x = s[i];
y= s1[i];
while (i < j)
{
while(i < j && s[j] > x) j--; /* 从右向左找第一个小于x的数 */
if(i < j) {s[i] = s[j];s1[i] = s1[j];i++;}
while(i < j && s[i] < x) i++; /* 从左向右找第一个大于x的数 */
if(i < j) {s[j] = s[i];s1[j] = s1[i];j--;}
}
s[i] = x;
s1[i]= y;
qsort(s,s1, l, i-1); /* 递归调用 */
qsort(s,s1,i+1, r);
}
}
int main()
{
int x,y,n,d,nagetiveY;
int i,count,caseindex=0,flag;
double left[scale],right[scale],temp;
double l,r;
while(scanf("%d%d",&n,&d)!=EOF)
{
if(n==0&&d==0) break;
count=0;caseindex++;nagetiveY=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
temp=sqrt(d*d-y*y);
left[i]=x-temp;
right[i]=x+temp;
if(y<0||y>d) nagetiveY=1;//纵坐标小于0 或 纵坐标大于d 均事做不可行
}
if(d<=0) {printf("Case %d: -1\n",caseindex);continue;} //d必须为正。
if(nagetiveY==1) {printf("Case %d: -1\n",caseindex);continue;}
//排序
qsort(right,left,0,n-1);
flag=0;
//贪心选择
for(i=0;i<n;i++)
{
if(flag==0)
{
l=left[i];r=right[i];flag=1;count++;
//printf("flag=0,l=%f,r=%f\n",l,r);
}
else
{
l=(left[i]>l)?left[i]:l;
r=(right[i]<r)?right[i]:r;
//printf("flag=1,l=%f,r=%f\n",l,r);
if((r-l)<0) {flag=0;i--;}
}
}
//输出结果
printf("Case %d: %d\n",caseindex,count);
}
return 0;
}
测试数据,来源于poj讨论组
2 5 -3 4 -6 3 4 5 -5 3 -3 5 2 3 3 3 20 8 -20 7 -18 6 -5 8 -21 8 -15 7 -17 5 -1 5 -2 3 -9 6 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 7 9 6 10 5 0 0 2 3 0 2 2 3 2 3 0 2 1 3 3 3 1 2 -3 2 2 4 8 5 2 4 -4 4 -3 3 -3 1 -3 0 -1 0 0 5 6 0 3 0 1 2 -3 1 2 1 3 2 1 2 -3 1 2 1 1 2 0 2 2 3 0 2 2 3 4 -5 4 3 4 3 2 3 6 -9 3 -3 1 2 -3 2 2 1 6 2 1 2 1 2 1 2 -3 1 2 1 0 0 1 2 0 2 2 3 0 2 1 3 3 10 1 10 2 3 4 5 3 5 1 10 2 3 4 5 4 7 1 10 2 3 4 5 0 0 3 9 1 10 2 3 4 5 2 5 0 3 8 3 0 0
运行结果:
Case 1: 1
Case 2: 2
Case 3: 4
Case 4: 1
Case 5: 1
Case 6: -1
Case 7: 3
Case 8: -1
Case 9: 2
Case 10: 1
Case 11: 1
Case 12: -1
Case 13: -1
Case 14: 2
Case 15: 1
Case 16: 1
Case 17: 1
Case 18: -1
Case 19: -1
Case 20: -1
Case 21: 1