直接二分线缆的长度于题目输入的分块数量进行比较,找到数量一致线缆长度最长的点。
- 注意精度问题(浮点数二分)(for)
- 注意保留两位数字的问题
#include <iostream>
#include <cmath>
using namespace std;
const int INF = 100010;
const int N = 10010;
int n, k;
double l[N];
bool judge(double x)
{
int num = 0;
for (int i = 1; i <= n; i ++)
num += (int)(l[i]/x);
return num >= k;
}
void solve()
{
double l = 0, r = INF;
for (int i = 1; i <= 100; i ++)
{
double mid = (l + r)/2;
if(judge(mid)) l = mid;
else r = mid;
}
printf("%.2lf\n", floor(r*100)/100); // 避免四舍五入进位
}
int main()
{
while(scanf("%d%d", &n, &k) != -1)
{
for (int i = 1; i <= n; i ++)
scanf("%lf", &l[i]);
solve();
}
return 0;
}