思路:
使用浮点二分法,判断能否剪出要求的绳子数量,二分出来的就是绳子长度,当长度为x的时候可以剪出要求数量的绳子,那么小于x的都可以剪出来,此时再去看大于x的绳子长度。
开始状态:l=0,r=1e9,mid=(l+r)/2。
判断能总共剪出长度为 mid 的绳子多少根:总共能剪出的根数=每一根绳子能剪出的根数之和。
如果能剪出长度为mid的绳子,则l=mid,如果不能,则r=mid。
直到r−l<1e−4。
详细代码:
#include<iostream>
using namespace std;
const int N = 100010;
int n,m;
int w[N];
bool check(double mid)
{
int cnt = 0 ;
for(int i = 0 ;i<n;i++)
cnt += w[i] / mid;
return cnt >=m;
}
int main()
{
cin >> n >> m;
for(int i = 0;i<n;i++)cin >> w[i];
double l = 0 ,r = 1e9;
while( r - l > 1e-4)
{
double mid = (l + r ) / 2;
if(check(mid))l = mid;
else r = mid;
}
printf("%.2lf\n",r);
return 0;
}