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 }

 



其实,我个人觉得,这道题目有些问题。当初的解法只是,算大圆的相交,圆心距问题,这是切入点。但是,这只是个初步的想法,试着就写了一些、下,没想到竟然过了。可是,如果每个圆的半径都非常小,但是圆的个数足够,能够覆盖整个草坪面积。那么,上面的这个解法就不行了。因为,我只是从中心线考虑的。

 

 

posted @ 2012-12-10 17:19  牧童不吃蛋炒饭  阅读(242)  评论(0)    收藏  举报