精度这个东西好神奇~如果判断一个double的数大于0,直接让这个double跟一个很小的数的负数比较大小~!!!!!!!!!
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
#include<cstring>
#include <algorithm>
#define N 10005
#define MIN 1e-11
#define M 1000001
using namespace std;
struct S
{
double a,b;
};
S s[N];
int n;
double l,w;
bool cmp(S x, S y)
{
return x.a < y.a;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
while(scanf("%d%lf%lf",&n,&l,&w)!=EOF)
{
w/=2;//
double x,ra,xx;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&x,&ra);
if(ra<=w)
{
s[i].a=-1;
s[i].b=-1;
continue;
}
xx=sqrt(ra*ra-w*w);
s[i].a=x-xx;
s[i].b=x+xx;
}
sort(s,s+n,cmp);
double f,r=0;
int i=0;
for(; i<n; i++)
{
if(s[i].b>0)
{
f=s[i].a;
break;
}
}
int flag=0;
if(f>0)
flag=1;
int cnt=0;
double lg=0;
while(r<l&&!flag)
{
flag=1;
// for(;i<n&&r-s[i].a>MIN; i++)//错了
for(;i<n&&r-s[i].a>-MIN; i++)//-MIN换成MIN就错了
{
if(s[i].b>lg)
{
lg=s[i].b;
flag=0;
}
}
r=lg;
cnt++;
}
if(!flag&&lg>=l)//lg>=l别忘
{
printf("%d\n",cnt);
}
else
printf("-1\n");
}
return 0;
}