喷水装置问题
喷水装置(二)时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
输入
第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
输出
每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。
样例输入
2
2 8 6
1 1
4 5
2 10 6
4 5
6 5
样例输出
1
2
以上是题目描述,下面是我写的,当然测试数据都能通过,但是就是不能AC,链接地址:http://acm.nyist.
代码如下:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n,w,h,m;
int count=0;
float sum=0;
cin>>n;
while(n--)
{
int a,b,i,j;
cin>>m>>w>>h;
int r[1000],x[10004]; //坐标和半径的存储
for(i=0;i<m;i++)
{
cin>>x[i]>>r[i];
}
for(i=0;i<m-1;i++)
for(j=i+1;j<m;j++)
{
if(r[i]<r[j])
{
a=r[i];r[i]=r[j];r[j]=a;
b=x[i];x[i]=x[j];x[j]=b;
}
else if(r[i]==r[j])
if(x[i]>x[j])
{
a=r[i];r[i]=r[j];r[j]=a;
b=x[i];x[i]=x[j];x[j]=b;
}
} //以上为排序,让半径大的拍在前面,如果半径相同,则坐标小的在前面
if(r[0]>=sqrt(h*h/4+x[0]*x[0])) //继续判断条件
for(i=0;i<m;i++)
{
sum=sqrt(r[i]*r[i]-(h/2)*(h/2))+x[i];
if(sum>=w){cout<<(i+1)<<endl;break;}
else if(i>=m&&sum<w)cout<<0<<endl;
}
else cout<<0<<endl;
}
return 0;
}