[提交] [状态] [讨论版] [命题人:admin]
题目描述
长L米,宽W米的草坪里装有n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。
请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?
输入
输入包含若干组测试数据。
第一行一个整数T表示数据组数;
每组数据的第一行是整数n、L和W(n≤15000);
接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。
输出
对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出 -1
数组大小15000 不用sort会超时
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include
using namespace std;
struct TLE
{
double a;
double b;
} A[15200];
bool cmp(TLE a1,TLE b1)
{
return a1.a<b1.a;
}
int main()
{
double sum,l,t,w,x,max;
int i,j,m,n;
scanf("%d",&m);
while(m–)
{
int count=0;
scanf("%d%lf%lf",&n,&l,&w);
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&A[i].a,&A[i].b);
if((2*A[i].b)<w)
{
A[i].a=0; A[i].b=0;
}
}
for(i=1;i<=n;i++) //求有效线段长度;
{
if(A[i].a!=0)
{
sum=sqrt(A[i].b*A[i].b-(w/2)*(w/2));
A[i].b=A[i].a+sum;
A[i].a=A[i].b-(2*sum);
}
}
sort(A+1,A+1+n,cmp); // 排序
int flag=0; //标志中途是否结束
i=1;
t=0;
while(t<l) //t代表长度 ,t>=l就退出
{
count++;
double s=t; // s也代表长度
while(A[i].a<=s&&i<=n)
{
if(t<A[i].b)
t=A[i].b;
i++;
}
// 不进去while且s<l 中间就断开了
if(s==t&&s<l)
{
flag=1;
break;
}
if(flag==1)
break;
}
if(flag==1)
printf("-1\n");
else
printf("%d\n",count);
}
return 0;
}