2014/12/10
太渣,错了很多次。。贪心贪吧,贪吧。
一个个遍历算半径会有精度问题,要一开始就算出点的所在的左右半径中心。。
#include<stdio.h>
#include<string.>
#include<algorithm>
#include<math.h>
using namespace std;
double d;
struct node{
double l,r;
}s[1005];
int cmp(node a,node b)
{
return a.l<b.l;
}
int main()
{
int n;
int k = 1;
double a,b;
while(~scanf("%d%lf",&n,&d)&&n&&d)
{
int temp = 0;
for(int i =0 ;i < n; i++)
{
scanf("%lf%lf",&a,&b);
if(fabs(b) > d)
{
temp = 1;
}
s[i].l = a-sqrt(d*d-b*b);
s[i].r = a+sqrt(d*d-b*b);
}
if(temp)
{
printf("Case %d: -1\n",k++);
continue;
}
sort(s,s+n,cmp);
double point ;
int cnt = 1;
point = s[0].r;
for(int i = 1;i < n; i++)
{
if(point < s[i].l)
{
point = s[i].r;
cnt++;
}
else if(point > s[i].r)
{
point = s[i].r;
}
}
printf("Case %d: %d\n",k++,cnt);
}
return 0;
}