题目大意:有n棵树,树的有效长度已知,要用这些树造k个长度相同的柱子,问每根柱子最长的长度是多少。
1<=n,k<=10000
思路:为了防止精度问题,可以先把每个树的长度都乘以100,变成整数进行运算,最后输出答案时再对结果除以100,我们对柱子数量进行二分,查找的范围是从1到最长的树的长度,对于每一次枚举,统计用每个树的长度除以mid的结果,也就是每棵树能造几根柱子,将能造出的柱子数量与要求的柱子数量进行比较
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<math.h>
using namespace std;
int n, k;
int w[10005];
int check(double x)
{
int cnt = 0;
for (int i = 1; i <= n; i++)
{
cnt += (w[i] / x);
}
return cnt ;
}
int main()
{
cin >> n >> k;
int M = 0;
double len;
for (int i = 1; i <= n; i++)
{
scanf("%lf", &len);
w[i] = len*100;
M = max(M, w[i]);
}
int l = 1, r = M, mid,ans=0;
while (l<=r)
{
mid = (r + l) / 2;
if (check(mid)>=k)
{//如果造出来的柱子比要求的还多,说明可以加大每一根柱子的长度
ans = max(ans, mid);
l = mid+1;
}
else//如果造出来的柱子比要求的少,就要缩短每个柱子的长度
r = mid-1;
}
printf("%.2f\n",(double)ans/100.0);
return 0;
}