瞎了。。。WA了10+次,坑爹啊
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
const double eps=1e-7;
struct st
{
double left,right;
}spk[10010];
int lfcmp(double x)
{
return x>-eps?1:-1;
}
int cmp(const void *a,const void *b)
{
return lfcmp((*(st *)a).left-(*(st *)b).left);
}
int main()
{
int i,n,l,w,r[10010],pos[10010],ans,flag,j;
double min,max;
while(scanf("%d%d%d",&n,&l,&w)!=EOF)
{
min=max=0;
ans=flag=j=0;
for(i=0;i<n;i++)
scanf("%d%d",&pos[i],&r[i]);
for(i=0;i<n;i++)
{
if(r[i]*2>=w)//这个条件挺关键的
{
double d=sqrt((double)r[i]*r[i]-(double)w*w/4.0);//全部都要double才能过……
spk[j].left=pos[i]-d;
spk[j].right=pos[i]+d;
j++;
}
}
n=j;
qsort(spk,n,sizeof(st),cmp);
i=0;
while(i<n)
{
j=i;
max=min;
while(j<n&&lfcmp(min-spk[j].left)>0)
{
if(lfcmp(spk[j].right-max)>0)
max=spk[j].right;
j++;
}
if(i==j)
break;
ans++;
min=max;
i=j;
if(lfcmp(max-l)>0)
{
flag=1;
break;
}
}
if(!flag)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}