题目要求寻找最大的m根绳子的长度大小,那可以从最长的绳子入手,利用二分的方法,不断缩短长度区间来寻找最大值;
#include<iostream>
using namespace std;
int n, m, a[100005], ans = -1;
double erf(int x){
double l = 0, r = x;
while(l < r){//判断循环结束,当区间左边界大于或等于右边界时,说明区间内已无其它数据,则l为最大值
double mid = (l + r) / 2;
ans = 0;
for(int i = 0; i < n ; i++){
ans += 1.000 * a[i] / mid;
}
if(ans >= m) l = mid + 0.0005;
else r = mid - 0.0005;//边界稍微变动大小,幅度不影响结果,便于跳出循环
}return l;
}
int main(){
cin >> n >> m;
for(int i = 0; i < n ; i++){
cin >> a[i];
ans = max(ans, a[i]);//寻找数据最大值
}
double xx = erf(ans);
printf("%.2lf", xx);
return 0;
}