题目描述
有 �N 条绳子,它们的长度分别为 ��Li。如果从它们中切割出 �K 条长度相同的绳子,这 �K 条绳子每条最长能有多长?答案保留到小数点后 22 位(直接舍掉 22 位后的小数)。
输入格式
第一行两个整数 �N 和 �K,接下来 �N 行,描述了每条绳子的长度 ��Li 。
输出格式
切割后每条绳子的最大长度。答案与标准答案误差不超过 0.010.01 或者相对误差不超过 1%1% 即可通过。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_N 100005
int n;
double k, a[MAX_N];
int check(double m) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += (int)(a[i] / m);
}
return sum >= k; // 直接返回布尔值
}
int main() {
scanf("%d %lf", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%lf", &a[i]);
a[i] *= 100; // 将数据先扩大100倍
}
int l = 0, m, r = 100000000; // 定义上下界
while (l <= r) {
m = (l + r) / 2;
if (m == 0) break; // 增强健壮性
if (check(m)) {
l = m + 1;
} else {
r = m - 1;
}
}
printf("%.2lf\n", 1.0 * r / 100); // 输出时,先将其*1.0转变成浮点数,后再去除开始扩大的100倍
return 0;
}