
代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, k, max_len;
int a[N];
// 计算长度为mid时,能切出的段数
int check(int mid) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
cnt += a[i] / mid;
}
return cnt;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
max_len = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
max_len = max(max_len, a[i]);
}
// 特殊情况:如果连1cm都切不出k段,直接输出0
if (check(1) < k) {
cout << 0 << endl;
return 0;
}
// 二分查找最大的l
int l = 1, r = max_len;
while (l < r) {
// 注意:避免死循环
int mid = (l + r + 1) >> 1;
if (check(mid) >= k) {
// 如果能切出至少k段,说明可以尝试更大的长度
l = mid;
} else {
// 否则,必须减小长度
r = mid - 1;
}
}
// 循环结束时,l == r,就是最大的可行长度
cout << l << endl;
return 0;
}