首先对所有的cables按长度从大到小排个序,然后对0.0到最大长度的cable进行二分.
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
#include <functional>
using namespace std;
#define eps 1e-4
const int maxn=10010;
double cb[maxn];
int n,m;
int main(){
int t;
scanf("%d",&t);
while (t--){
scanf("%d%d",&n,&m);
for (int i=0;i<n;++i){
scanf("%lf",&cb[i]);
}
sort(cb,cb+n,greater<double>());
double l=0.0,r=cb[0],ans=0.0;
while (l<r-1e-2){
double mid=(l+r)/2.0;
int t=m,i=0;
while (t>0&&i<n){
t-=(int)(cb[i]/mid);
if((int)(cb[i]/mid)==0)break;//当前的cable长度比需要的短,那么后面的也就没有查了
++i;
}
if(t>0)r=mid;
else{
ans=max(ans,mid);
l=mid;
}
}
printf("%.2lf\n",ans);
}
return 0;
}