/* 有一塊草坪,長為l,寬為w, 在它的水平中心線上有n個位置可以安裝噴水裝置, 各個位置上的噴水裝置的覆蓋範圍為以它們自己的半徑ri為圓。求出最少需要的噴水裝置個數。 將他映射到一邊,變成區間覆蓋問題 */#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;#define N 10005 struct line{ double left,right; }a[N];bool cmp(line a,line b){ return a.left<b.left; }int main(){ int n; double l,w,x,r,y; int num; while(scanf("%d%lf%lf",&n,&l,&w)!=EOF) { num=0; for(int i=0;i<n;i++) { scanf("%lf%lf",&x,&r); if(2*r<=w) continue; y=sqrt(1.0*r*r-w*w/4.0); a[num].left=x-y; a[num].right=x+y; num++; } if(num==0) { printf("-1\n"); continue; } sort(a,a+num,cmp); bool flag=0; int cnt=0; double left=0; double right=0; // for(int i=0;i<num;i++) // printf("%lf %lf++\n",a[i].left,a[i].right); if(a[0].left<=0) { int i=0; while(i<num) { int j=i; while(j<num && a[j].left<=left) { if(a[j].right>right) { right=a[j].right; } j++; } if(i==j) break; cnt++; left=right; i=j; if(left>=l) { flag=true; break; } } } if(flag) printf("%d\n",cnt); else printf("-1\n"); } return 0; }