喷水装置(一)
 
 
  时间限制:
  
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 
    
      
     
    
     #include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
bool compare(double a,double b)
{
      return a>b;  //a>b 降序,a<b,升序
}
int main()
{
       int TestNum,size;
       double data;
       cin>>TestNum;
       while(TestNum--)
       {
              cin>>size;
              double* arr = new double[size];
              for(int i =0;i<size;i++)
              {
                     cin>>data;
                     arr[i] = data;
              }
              sort(arr,arr+size,compare);
              double key = 20.0;
              int j = 0;
              while(key>0)
              {
                     key -= 2*sqrt(arr[j]*arr[j] - 1.0);
                     j++;
              }
              cout<<j<<endl;
              delete [] arr;
       }
       return 0;
}
     
     
    
     //由上图可知,圆与长方形的几何关系满足等式  R^2 = L^2+ 1^2; 圆半径R默认大于等于1,即切距2L为完全覆盖的长度,当累计圆的切距大于等于长方形长度时,满足条件。(根据题意,对数组按降序排列,找出最少的个数。)