Description 有N条绳子,它们的长度分别为Li,Li都是正整数。如果从它们中切割出K条长度相同的绳子(绳子的长度为整数),这K条绳子每条最长能有多长?
Input 第一行一个数 N(1≤ N ≤100000),表示绳子的数量。 第二行 N 个数,分别表示原绳子的长度 Li,1≤ Li ≤100000。 第三行一个数K,1≤ K ≤100000,表示要切割出的绳子数量。
Output
一行一个大于等于0的整数,表示 K 条绳子中每条绳子的最大长度,注意:如果无法切割则输出0。
样例
输入(1)
4
8 7 4 5
3
输出(1)
5
输入(2)
1
20126
1
输出(2)
20126
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool canCut(vector<int>& ropes, int k, int length) {
int count = 0;
for (int rope : ropes) {
count += rope / length;
}
return count >= k;
}
int main() {
int n;
cin >> n;
vector<int> ropes(n);
int max_length = 0;
for (int i = 0; i < n; i++) {
cin >> ropes[i];
max_length = max(max_length, ropes[i]);
}
int k;
cin >> k;
int left = 1; // 最小可能长度
int right = max_length; // 最大可能长度
int result = 0;
while (left <= right) {
int mid = left + (right - left) / 2;
if (canCut(ropes, k, mid)) {
result = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
cout << result << endl;
return 0;
}