这道题很难想出来用二分法去做,并且不能从模拟的层面下手,解法是通过二分计算每条绳子的可切割的数量是否满足m,如果不满足m,去掉左半边(说明还不是最长的)。
#include<bits/stdc++.h>
using namespace std;
const int N = 100100;
long long slen[N];
int n, m;
int main()
{
cin >> n >> m;
for(int i = 1; i <= n;i ++)
{
cin >> slen[i];
}
//以上是常规输入
- - -
//下面是二分
double l = 0, r = 1e9;
while(r - l > 1e-3)//浮点数二分,两数之差小于精度要求时跳出
{
double mid = (l + r)/2;
int cnt = 0;//
for(int i = 1; i <= n; i++)
{
cnt += slen[i] / mid;//一根绳子能剪出多少长度为 m 的绳子
if(cnt >= m){
l = mid;
break;
}
}
if(cnt < m) r = mid;
}
printf("%.2lf",l);
return 0;
}