原题链接
思路(浮点数二分)
1.二分其实就是增加一个条件,找到题中能二分的东西,判断临界即可
2.我们可以二分M根绳子的长度mid,依次枚举长度,直到找到符合的长度
3.符合的长度,就是能剪出长度为mid的绳子M根,扫一遍数组看能剪出多少根
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int a[N];
bool check(double x) {
int cnt = 0;
for (int i = 0; i < n; i++) { //看剪出长度为x的绳子有多少根
cnt += (int) a[i] / x;
}
if (cnt >= m) {
return true;
}
return false;
}
double bsearch() {
double l = 0, r = 1e9; //看数据范围枚举1-1e9
while (r - l > 1e-4) {//一般精确到给定精度的后两位
double mid = (l + r) / 2; //二分绳子的长度
if (check(mid)) {
l = mid;
} else {
r = mid;
}
}
return l;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
printf("%.2f", bsearch());
return 0;
}