题解:使用二分搜索,在输出小数问题上,一般都会指定允许的误差范围或者是输出中小数点后面的位数。因此在使用二分搜索法时,有必要设置合理的结束条件来满足精度的要求。
设定循环次数作为终止条件,1次循环可以把区间的范围缩小一半,100次的循环则可以达到10^(-30)的精度范围,基本上是没有问题的,也可以把精度设置为(ub-lb)>eps这样,指定一个区间的大小。在这种情况下,如果eps取得太小了,就有可能因为浮点小数精度的原因陷入死循环。
附上代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e4+50;
int n,k;
double s[maxn];
bool C(double x)
{
int num=0;
for(int i=0;i<n;i++){
num+=(int)(s[i]/x);
}
return num>=k;
}
int main()
{
double inf=0;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%lf",&s[i]);
inf=max(s[i],inf);
}
double lb=0,ub=inf;
for(int i=0;i<100;i++){
double mid=(lb+ub)/2;
if(C(mid)){
lb=mid;
}else{
ub=mid;
}
}
printf("%.2f\n",floor(ub*100)/100);
return 0;
}