喷水装置

长L米,宽W米的草坪里装有n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。

请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?

输入格式:
输入包含若干组测试数据。

第一行一个整数T表示数据组数。

每组数据的第一行是整数n、L和W的值,其中n≤10 000。

接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径。

如图1所示的示意图是样例输入的第一组数据所描述的情况。

ttt.jpg
图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;
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值