考点:浮点数二分
这道题正常想很难找到突破口,如果我们利用逆向思维,把它转化为一个判定问题,就会变得容易。
试想,如果把已知的几段绳子均切为长度为mid的话,可以切几段?
这时我们可以用二分的方法,逐步趋近我们要找的答案。
如果能够切成的段数cnt大于需求绳子的数量m,那么我们就可以把每段切得更长,即切成长度均为 >mid 的几段,也就是在二分区间的右半区间(更大的一边)。反之,在mid左边。
直到可以把已知的几段绳子切成需求绳子的数量时,此时,每段的长度就是我们要找的裁剪后的最大长度。
#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; //都切成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",r);
return 0;
}