思路:
1.题意是找到一个长度,可以使所给的绳子能切割成k个这样长度的绳子,最小精度是厘米;
2.方法就是二分查找,每次比较此次的mid
值是否符合题意;
3.因为使用double
我们无法用left<=right
终止循环,那就循环足够多的次数来提高精度即可;
4.最后输出不可以直接使用.2f
,因为会四舍五入;
代码:
#include<iostream>
#include<cmath>
using namespace std;
const int MAX_N=1e4+99;
const double INF=1e7;
int n,k;
double cab[MAX_N];
bool ok(double m){
int ans=0;
for(int i=0;i<n;i++) ans+=(int)(cab[i]/m);
return ans>=k;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%lf",cab+i);
double l=0,r=INF;
for(int i=0;i<100;i++){
double mid=(l+r)/2;
if(ok(mid)) l=mid;
else r=mid;
}
printf("%.2f",floor(l*100)/100);
return 0;
}