题目描述
长 L 米,宽 W 米的草坪里装有 n 个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。
请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?
输入格式
输入包含若干组测试数据。
第一行一个整数 T 表示数据组数;
每组数据的第一行是整数 n、L 和 W;
接下来的 n 行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。
输出格式
对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出 -1 。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
int L,W,x,r;
struct qj{
double le;
double ri;
}a[15005];
bool cmp(qj x,qj y){
return x.le<y.le;
}
void Read(){
cin>>n>>L>>W;
cnt=0;
for(int i=1;i<=n;i++){
cin>>x>>r;
if(r<=W/2){
continue;
}
cnt++;
a[cnt].le=x-sqrt(r*r-W*W/4.0);
a[cnt].ri=x+sqrt(r*r-W*W/4.0);
}
}
void Solve(){
double t=0;
int ans=0;
int bj=1;
int i=1;
while(t<L){
ans++;
double s=t;
for(;a[i].le<=s&&i<=cnt;i++){
if(t<a[i].ri){
t=a[i].ri;
}
}
if(t==s&&s<L){
cout<<-1<<endl;
bj=0;
break;
}
}
if(bj){
cout<<ans<<endl;
}
}
int main()
{
int T;
cin>>T;
while(T--){
Read();
sort(a+1,a+1+cnt,cmp);
Solve();
}
return 0;
}