NYOJ 6 喷水装置(一)

/*

题目大意: 在长为20米,宽为2米的草坪中心线上(注意是中心线)放置半径为Ri的喷水装置。

求满足草坪全部湿润的情况下(覆盖的长度>=20),最少使用多少喷水装置。

*/

每个喷水装置覆盖的范围如图:

情况一:半径<=1的喷水装置覆盖的长度为0,半径<=1的喷水装置应该摒弃。 情况二:喷水装置的覆盖范围为 = 2*x = 2*sqrt(R*R-1); 

  1. #include<cstdio>  
  2. #include<cmath>  
  3. #include<cstring>  
  4. #include<algorithm>  
  5. using namespace std;  
  6. int cmp(double a,double b)   
  7. {  
  8.     return a>b;  
  9. }  
  10. double f(double R)  //求出每个喷水装置覆盖的长度   
  11. {  
  12.     return 2*sqrt( (double)(R*R-1) );   
  13. }  
  14. int main()  
  15. {  
  16.     int T,m,i,k;  
  17.     double sum,t,a[1010];  
  18.     scanf("%d",&T);  
  19.     while(T--)  
  20.     {  
  21.         memset(a,0,sizeof(a));  
  22.         scanf("%d",&m);  
  23.         for(i=0,k=0; i<m; i++)  
  24.         {  
  25.             scanf("%lf",&t);  
  26.             if(t>1)  
  27.                 a[k++] = t;//将半径大于一的喷水装置存入数组,装置个数为k。   
  28.         }  
  29.         sort(a,a+k,cmp);  //快排,将喷水装置的覆盖长度,由大到小排序   
  30.         for(i=0,sum=0.0; i<k; i++)  
  31.         {  
  32.             sum+=f(a[i]);  
  33.             if(sum>=20.0)    
  34.             {  
  35.                 break;  
  36.             }  
  37.         }  
  38.         printf("%d\n",i+1);  
  39.     }  
  40.   
  41.     return 0;  
  42.       
  43. }  
posted @ 2015-07-03 20:00  小松鼠。  阅读(138)  评论(0编辑  收藏  举报