时间限制: 1000 ms 内存限制: 65536 KB【题目描述】长 LL 米,宽 WW 米的草坪里装有 nn 个浇灌喷头。每个喷头都装在草坪中心线上(离两边各 W2W2 米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。 请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头? 【输入】输入包含若干组测试数据。 第一行一个整数 TT 表示数据组数; 每组数据的第一行是整数 nn、LL 和 WW; 接下来的 nn 行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。 【输出】对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出 −1−1 。 【输入样例】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 【输出样例】6
2
-1 【提示】数据范围: 对于 100% 的数据,n≤15000。 |
#include<bits/stdc++.h>
using namespace std;
int m,n,r,wc,cc,ww,t;
struct node{
double x,y;
}a[150001];
bool cmp(node a,node b){
return a.x<b.x;
}
int main(){
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
scanf("%d%d%d",&n,&cc,&wc);
t=0;
for(int i=1;i<=n;i++){
scanf("%d %d",&ww,&r);
if(r<=wc/2) continue;
a[++t].x=ww-sqrt(r*r-wc*wc/4.0);
a[t].y=ww+sqrt(r*r-wc*wc/4.0);
}
sort(a+1,a+1+t,cmp);
double c=0;int cwc=0,ans=0,i=1;
while(c<cc){
double z=c;ans++;
for(;a[i].x<z&&i<=t;i++)
c=max(c,a[i].y);
if(c==z){
cwc=1;
break;
}
}
if(cwc==1)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}