6、喷水装置(一)
喷水装置(一)
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
- 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
- 输入
- 第一行m表示有m组测试数据
每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。 - 输出
- 输出所用装置的个数
- 样例输入
-
2 5 2 3.2 4 4.5 6 10 1 2 3 1 2 1.2 3 1.1 1 2
- 样例输出
-
2 5
View Code
1 #include <iostream> 2 #include <algorithm> 3 #include <math.h> 4 using namespace std; 5 double fun(double r)//一个圆的最大覆盖长度 6 { 7 return 2 * sqrt(r * r - 1 ); 8 } 9 int main() 10 { 11 int m,n; 12 double a[601]; 13 cin >> m; 14 while(m--) 15 { 16 cin >> n; 17 for (int i = 0; i < n; i++) 18 { 19 cin >> a[i]; 20 } 21 sort( a,a+n); //将这组数据进行排序,(半径越大覆盖面积越大)类似与贪心算法的思想 22 double t = 0,add = 0; 23 for(int i = n-1; i >= 0; i--) 24 { 25 add += fun(a[i]); //累加每个圆的最大覆盖长度 26 t++; 27 if(add >= 20)break; //若长度大于20,说明能够全部覆盖,结束输出最少的圆个数t 28 } 29 cout<<t<<endl; 30 } 31 32 return 0; 33 }
其实,我个人觉得,这道题目有些问题。当初的解法只是,算大圆的相交,圆心距问题,这是切入点。但是,这只是个初步的想法,试着就写了一些、下,没想到竟然过了。可是,如果每个圆的半径都非常小,但是圆的个数足够,能够覆盖整个草坪面积。那么,上面的这个解法就不行了。因为,我只是从中心线考虑的。

浙公网安备 33010602011771号