其实题目是区间覆盖.
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <memory.h>
#include <limits.h>
using namespace std;
const int maxn = 10010;
struct interval{
double l, r;
bool operator<(const interval & rhs)const{
return l < rhs.l;
}
}its[maxn];
int n;
double l, w;
int main(){
while (~scanf("%d%lf%lf", &n, &l, &w)){
int m = 0;
for (int i = 0; i < n; ++i){
double p, t;
scanf("%lf%lf", &p, &t);
if(w / 2 < t){
double r = sqrt(t * t - w * w / 4.0);
double x = p - r;
double y = p + r;
its[m].l = x;
its[m++].r = y;
}
}
sort(its, its + m);
double minl = its[0].l, maxr = its[0].r;
int ans = 1;
for (int i = 0; i < m; ){
int j = i, idx = -1;
double maxRight = INT_MIN;
while(j < m && its[j].l <= maxr){
if(its[j].r > maxRight && its[j].r > maxr){
maxRight = its[j].r;
}
++j;
}
if(j == i)break;
i = j;
if(maxRight != INT_MIN){
if(maxr <l){
ans++;
}
maxr = maxRight;
}
}
if(minl <= 0 && maxr >= l){
printf("%d\n", ans);
}else{
printf("-1\n");
}
}
return 0;
}