剪绳子
很简单的二分题目
不过这道题是浮点数二分,和整数二分是有点区别的。当时就卡了半小时
由于绳子的长度范围是0~10^9,因此二分的范围就是0——10 ^ 9。
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
int n, m;
int a[100010];
bool check(double mid){
int cnt = 0;
for(int i = 1; i <= n; i ++){
cnt += a[i] / mid;
if(cnt >= m)
return true;
}
return false;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++)
cin >> a[i];
double l = 0, r = 1e9;
while(r - l > 1e-5){
double mid = (l + r) / 2; //左边先向右移动的时候不需要再+1
if(check(mid))
l = mid;
else
r = mid; //和整数二分不同的地方,不像整数二分一样+1/-1
}
cout << setiosflags(ios::fixed) << setprecision(2) << l << endl;
return 0;
}