原题: http://acm.nyist.net/JudgeOnline/problem.php?pid=6
//思路:根据喷水装置的半径,我们可以将它们转化为一个有效的喷水范围(线段),每次选择范围最长的,直到覆盖完整个长度
//关键在于转化 喷水装置的有效覆盖范围,贪心体现在每次取长度最长的线段
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
double r[601];
int cmp(const void *aa,const void * bb)
{
double a=*(double*)aa;
double b=*(double*)bb;
return a<b;
}
int main()
{
const double w=2;
const double l=20;
int t;
scanf("%d",&t);
while(t--)
{
int n;
int pos=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
double a;
scanf("%lf",&a);
if(a>w/2)
{
r[pos]=2*sqrt(a*a-w*w/4);
pos++;
}
}
// sort(r,r+pos,cmp);
qsort(r,pos,sizeof(r[0]),cmp);
double ei=0;
int cnt=0;
for(int i=0;i<pos;i++)
{
ei=ei+r[i];
cnt++;
if(ei>=l){
break;
}
}
printf("%d\n",cnt);
}
return 0;
}
3373

被折叠的 条评论
为什么被折叠?



