http://acm.nyist.net/JudgeOnline/problem.php?pid=6
典型的贪心,最优装载问题。
每个喷水口最大覆盖长度为:2*sqrt(a[i]*a[i]-1
把喷水口半径从大到小排列,从最大的开始取就可以。
注意:半径1以及以下的喷水装置一点用也没有。题目中说肯定会全部湿润,所以不用管这种情况。
#include <iostream>
#include <cmath>
using namespace std;
double a[610];
int main()
{
int m;
cin>>m;
while(m--){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++){
if(a[i]<a[j]) swap(a[i],a[j]);
}
double length=0;
for(int i=0;i<n;i++){
length+=2*sqrt(a[i]*a[i]-1);
if(length>=20) {
cout<<i+1<<endl;
break;
}
}
}
return 0;
}