图片加载可能有点慢,请跳过题面先看题解,谢谢
客人是要吃整块又不是吃整个。。。
所以你还不会做?
$
$
那你就可以二分一个答案 \(x\) 啊,然后看一下所有的派都用来切成面积为 \(x\) 的整块最多能切成多少块(记得要向下取整)
如果块数大于等于 \(F+1\) ,那就说明 \(x\) 合法
那你不就 \(AC\) 了嘛
//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define db double
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();
if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }
const db pi=acos(-1.0);
int T,n,f;
db S[10010],Max;
il void init(){
n=gi(),f=gi()+1;
for(RG int i=1;i<=n;i++){
RG db r=gi(); S[i]=pi*r*r;
Max=max(Max,S[i]);
}
}
il bool ck(db x){
RG long long s=0;
for(RG int i=1;i<=n;i++) s+=floor(S[i]/x);
return 0;
}
il void work(){
RG db l=0,r=Max;
while(r-l>1e-5){
RG db mid=(l+r)/2.0;
if(ck(mid)) l=mid;
else r=mid;
}
printf("%.5lf\n",l);
}
int main(){ T=gi(); while(T--){ init(); work(); } return 0; }