问题 C: 【贪心】喷水装置3
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
长L米,宽W米的草坪里装有n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。
请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?
输入
输入包含若干组测试数据。
第一行一个整数T表示数据组数;
每组数据的第一行是整数n、L和W(n≤15000);
接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。
输出
对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出 -1
样例输入 Copy
3
8 20 2
5 3
4 1
1 2
7 2
10 2
13 3
16 2
19 4
3 10 1
3 5
9 3
6 1
3 10 1
5 3
1 1
9 1
样例输出 Copy
6
2
-1
我的代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
/***
输入包含若干组测试数据。
第一行一个整数T表示数据组数;
每组数据的第一行是整数n、L和W(n≤15000);
接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径
*/
using namespace std;
int T;
struct Node{double x,y;} a[15010];
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)
{
printf("-1\n");
flag = 1;
break;
}
}
if(!flag)
printf("%d\n",ans);
}
return 0;
}