struct Line{
double _left ;
double _right ;
Line(){}
Line(double l , double r):_left(l) , _right(r){}
friend bool operator < (const Line& a , const Line& b){
if(a._left != b._left) return a._left < b._left ;
else return a._right > b._right ;
}
};
double L , W ;
int n ;
vector<Line> g ;
int DP(){
sort(g.begin() , g.end()) ;
int k = 0 ;
if(g[0]._left > 0) return -1 ;
double _right = 0 , next_right = 0 ;
int idx = 0 ;
while(idx < g.size()){
int i = idx ;
while(i < g.size() && g[i]._left<= _right){
next_right = max(next_right , g[i]._right) ;
i++ ;
}
if(i == idx) return -1 ;
_right = next_right ;
idx = i ;
k++ ;
if(_right >= L) return k ;
}
return -1 ;
}
int main(){
int i ;
double x , y , r ;
while(cin>>n>>L>>W){
g.clear() ;
for(i = 0 ; i < n ; i++){
scanf("%lf%lf" ,&x , &r) ;
if(r > W/2){
double d = sqrt(r*r - W*W/4) ;
g.push_back(Line(x - d , x + d)) ;
}
}
cout<< DP() << endl ;
}
return 0 ;
}
UVA10308
最新推荐文章于 2020-07-10 21:52:51 发布