问题
https://vjudge.net/problem/UVA-10382
分析
将一个点的覆盖范围看作是一个长方形,舍弃弓形区域,变成区间覆盖问题,用贪心法
注意:bb-ww/4有可能小于0,要筛出
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=10000+5;
const double eps=1e-6;
struct spr{
double L,R;
bool operator < (const spr &rhs) const {
return L<rhs.L;
}
}sprs[maxn];
int n,kase=0,cnt;
double l,w,a,b;
int main(void){
while(scanf("%d%lf%lf",&n,&l,&w)==3){
cnt=0;
for(int i=0;i<n;++i){
scanf("%lf%lf",&a,&b);
if(b<=w/2+eps) continue;
double t=sqrt(b*b-w*w/4);
sprs[cnt].L=a-t;
sprs[cnt].R=a+t;
++cnt;
}
sort(sprs,sprs+cnt);
int ans=0,i=0;
double right=0,maxr=0;
while(true){
for(;i<cnt;++i){
if(sprs[i].L<right+eps){
maxr=max(maxr,sprs[i].R);
}else break;
}
if(maxr-right>eps) {
++ans;
right=maxr;
}else break;
if(right>l-eps) break;
}
if(right>l-eps) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}