有n条绳子,它们的长度分别为Li (Li <= 100000)。如果从它们中切割出k条长度相同(整数)的绳子的话,这k条绳子每条最长有多长? 如果无解,输出0。 输入格式: 第一行两个整数,分别为n(n <= 10000)和k。 第二行分别为n个整数,表示n条绳子的长度。 用C写出代码
时间: 2024-03-24 11:35:55 浏览: 177
以下是用C语言实现的代码:
```
#include <stdio.h>
int n, k;
int ropes[10000];
int check(int len) {
int cnt = 0;
for (int i = 0; i < n; i++) {
cnt += ropes[i] / len;
}
return cnt >= k;
}
int binary_search(int l, int r) {
if (l > r) {
return 0;
}
int mid = (l + r) / 2;
if (check(mid)) {
return binary_search(mid + 1, r);
} else {
return binary_search(l, mid - 1);
}
}
int main() {
scanf("%d%d", &n, &k);
int max_len = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &ropes[i]);
if (ropes[i] > max_len) {
max_len = ropes[i];
}
}
printf("%d\n", binary_search(1, max_len));
return 0;
}
```
主要思路是使用二分查找算法,从长度为1到所有绳子中最长的长度进行二分,查找是否能够切割出k条长度为mid的绳子。如果能够,就继续在[mid+1, r]区间查找;否则,在[l, mid-1]区间查找。最终返回的是最长的合法长度。
阅读全文