用c语言写4.分割绳子(40分,源文件命名:Test_A4) 【问题描述】 有n条绳子,每条绳子的长度已知且均为正整数。绳子可以以任意正整数长度切割,但不可以连接。现在要从这些绳子中切割出m条长度相同的绳段,求绳段的最大长度是多少。 【输入格式】 第一行是一个不超过100的正整数n,和一个不超过10^8的正整数m 第二行是n个不超过10^6的正整数,表示每条绳子的长度
时间: 2024-03-17 13:47:06 浏览: 46
好的,我的回答如下:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int *ropes = (int*) malloc(sizeof(int) * n);
int max_length = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &ropes[i]);
if (ropes[i] > max_length)
max_length = ropes[i];
}
int left = 0, right = max_length, mid;
while (left < right) {
mid = (left + right + 1) / 2; // 注意这里需要向上取整
int count = 0;
for (int i = 0; i < n; i++)
count += ropes[i] / mid;
if (count >= m)
left = mid;
else
right = mid - 1;
}
printf("%d\n", left);
free(ropes);
return 0;
}
```
解释一下这个程序的思路:
1. 首先读入输入的 n 和 m,以及每条绳子的长度,同时记录下最长的那条绳子的长度,因为长度相同的绳段最大长度不会超过最长的那条绳子的长度。
2. 二分查找最大的长度,从 0 到最长绳子的长度之间进行二分。每次选取当前左右边界的中点 mid,然后计算所有绳子能够切成多少段长度为 mid 的绳段,若段数大于等于 m,则说明 mid 可以作为候选答案,需要将左边界 left 调整为 mid;否则说明 mid 太大了,需要将右边界 right 调整为 mid-1。
3. 最终 left 就是最大的长度,输出即可。
希望我的回答能够帮助到你!
阅读全文