思路:圆的半径小于等于W/2时,他会存在边角,使草坪不能有效覆盖,而当半径大于W/2时,他能覆盖的有效距离可以看成【L-sqrt(r^2-(W/2)^2,L+sqrt(r^2-(W/2)^2】再用区间覆盖判断是否最大可到达L

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct w 
{
    double l;
    double r;
};
struct w a[15010];
bool cmp(struct w x,struct w y)
{
    return x.l<y.l;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        double L,W;
        int ans=0;
        cin>>n>>L>>W;
        int h=0;
        for(int i=0;i<n;i++)
        {
            double l,r;
            cin>>l>>r;
            if(r>W/2.0)
            {
                a[h].l=(double)l-sqrt(r*r-(W*W)/4);
                a[h].r=(double)l+sqrt(r*r-(W*W)/4);
                h++;
            }
        }
        sort(a,a+h,cmp);
        double idx=0;//上一次最大到达位置
        double mx=0;//每次最大到达的位置
           for(int i=0;i<h;i++){
               for(int j=i;j<h;j++){
                if(a[j].r>idx&&a[j].l<=idx){ //是否可到达这一位置
                    if(mx<a[j].r) mx=a[j].r;//单次到达最大位置
                } 
                else if(a[i].l>idx)
                    break;
               }
               ans++; 
               idx=mx; 
               if(idx>=L) break;
          }
          if(idx>=L) cout<<ans<<"\n";
          else cout<<-1<<"\n";
    }
    return 0;
}