1. 题目来源
链接:680. 剪绳子
相关题目:
2. 题目解析
涉及浮点数的二分答案。假设最后长度为 len
,则当二分值大于 len
的时候,剪到的绳子太少,不和要求。反之,剪得太多,就可以增加这个 len
。
浮点数判等需要注意。
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( 1 ) O(1) O(1)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+5;
const double eps = 1e-4;
int n, m;
int a[N];
bool check(double mid) {
int cnt = 0;
for (int i = 0; i < n; i ++ )
cnt += a[i] / mid;
return cnt >= m;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++ ) cin >> a[i];
double l = 0, r = 1e9;
while (r - l > eps) {
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
printf("%.2f\n", l);
return 0;
}