题目描述
有 N 条绳子,它们的长度分别为 Li。如果从它们中切割出 K 条长度相同的绳子,这 K 条绳子每条最长能有多长?答案保留到小数点后 2 位(直接舍掉 2 位后的小数)。
输入
第一行两个整数 N 和 K,接下来 N 行,描述了每条绳子的长度 Li。
输出
切割后每条绳子的最大长度,保证答案大于零。
样例输入
4 11
8.02
7.43
4.57
5.39
样例输出
2.00
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 1≤n≤k≤10,000,0<Li≤100,000
#include <iostream>
#include <cstdio>
using namespace std;
int n, k;
double num[10005], mmax;
int check(double mid) {
int cnt = 0;
for (int i = 0; i < n; i++) {
cnt += num[i] / mid;
}
return cnt;
}
double func() {
double l = 0, r = mmax;
while (r - l > 0.00001) {
double mid = (l + r) / 2;
int x = check(mid);
if (x >= k) {
l = mid;
} else {
r = mid;
}
}
return l;
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> num[i];
mmax = max(mmax, num[i]);
}
double ans = func();
printf("%d.%d%d\n", (int)ans, (int)(ans * 10) % 10, (int)(ans * 100) % 10);
return 0;
}