剪绳子
剪绳子
实数二分模板题
首先确定好l = 0, r = 1e9。
check函数不用特判mid必须小于a[i],即最短的裁剪长度可以比已经有的绳子的长度长。
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 100000+10;
int n,m;
int a[N];
bool check(double mid,int m)
{
int cnt = 0;
for (int i = 0; i < n; i ++ )
{
//if (a[i] < mid) return false;
cnt += a[i] / mid;
}
return cnt >= m;
}
int main(){
scanf("%d%d",&n,&m);
for (int i = 0; i < n; i ++ )
scanf("%d",&a[i]);
double l = 0, r = 1000000000;
while(r - l > 1e-3)
{
double mid = (l + r) / 2;
if (check(mid,m)) l = mid;
else r = mid;
//cout<<l<<' '<<r<<endl;
}
printf("%.2f",r);
return 0;
}