/*
有一块草坪,长为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;
}
UVa 10382
最新推荐文章于 2021-03-22 21:05:00 发布