长L米,宽W米的草坪里装有n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。
请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?
输入格式:
输入包含若干组测试数据。
第一行一个整数T表示数据组数。
每组数据的第一行是整数n、L和W的值,其中n≤10 000。
接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径。
如图1所示的示意图是样例输入的第一组数据所描述的情况。
图1
输出格式:
对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开还不能浇灌整块草坪,则输出-1。
#include
#include
#include
#include
using namespace std;
int T;
struct node{
double x,y;
}a[20005];//数组再一次的开小了。。。
int main()
{
scanf("%d",&T);
while(T–)
{
int n,l,w;
scanf("%d%d%d",&n,&l,&w);
int cnt = 0;
for(int i = 1;i <= n;i++)
{
int p,q;
scanf("%d%d",&p,&q);
if(2 * q <= w)continue;
cnt++;
a[cnt].x = p - sqrt(q * q - w * w/4.0);
a[cnt].y = p + sqrt(q * q - w * w/4.0);
}
double t = 0;
int ans = 0,flag = 0;
while(t < l)//在所有左端点小于上一个区间右端点的线段中选择右端点最大的一个
{
ans++;
double s = t;
for(int i = 1;i <= cnt;i++)
{
if(a[i].x <= s&&t < a[i].y)t = a[i].y;
}
if(t == s && s < l){//如果找不到两个区域之间断开了或者所有区域长度之和小于规定长度就输出-1
printf("-1\n");
flag = 1;
break;
}
}
if(flag == 0)printf("%d\n",ans);
}
return 0;
}