曾经我不信邪,碰到这题,我信了。
一开始做完全没有思路,百度看了下别人的代码,才知道这是用二分做的。太巧妙了,这或许是我最近想做acm的乐趣吧。但是知道它怎么做还得把它ac出来。
这道题太变态,不知道这里面到底有什么测试用例,一开始我直接让pi=3.1415927都没用,过了给的测试用例,但是就是不给过,我想了好久,最后百度才知道是这个变态原因
代码参考了别人的,但是是自己理解了后自己写的
#include<iostream>
#include<cmath>
using namespace std;
double pi=acos(-1.0);
double a[10001];
int n,m,f;
bool fun(double x){
int count=0;
for(int i=0; i<m; i++){
count+=int(a[i]/x);
}
if(count>=f+1)
return true;
else
return false;
}
int main(){
scanf("%d",&n);
while(n--){
double sum=0,r,max,low,top,mid;
scanf("%d %d",&m,&f);
for(int i=0;i<m;i++){
scanf("%lf",&r);
a[i]=pi*r*r;
sum+=a[i];
}
max=sum/(f+1);
top=max;
low=0.0;
mid=0.0;
while(top-low>1e-6){
mid=(low+top)/2;
if(fun(mid))
low=mid;
else
top=mid;
}
printf("%.4lf\n",mid);
}
return 0;
}