|
发表于 2024-5-2 22:12:33
|
显示全部楼层
这道题可以使用二分查找的思路解决。
首先,我们找到原木中最长的那根木头,作为切割后小段木头的最大长度的上限。
然后,设定最小长度为1,最大长度为该最大长度,使用二分查找的方式逼近符合条件的最大长度。
具体步骤如下:
1. 将输入的原木长度保存到一个vector中。
2. 找到vector中最长的木头,作为切割后小段木头的最大长度的上限。
3. 使用二分查找的方式逼近符合条件的最大长度。
- 设定最小长度为1,最大长度为上限。
- 计算中间长度mid,表示当前尝试的小段木头长度。
- 遍历vector,计算能够切割出来的小段木头数量。
- 如果小段木头数量大于等于k,说明当前mid满足要求,更新最小长度为mid+1。
- 如果小段木头数量小于k,说明当前mid不满足要求,更新最大长度为mid-1。
4. 当最小长度大于最大长度时,停止二分查找,并输出最大长度。
下面是一种可能的实现方式:
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- int n, k;
- cin >> n >> k;
- vector<int> wood(n);
- int maxLength = 0; // 最长木头的长度
- for (int i = 0; i < n; i++) {
- cin >> wood[i];
- maxLength = max(maxLength, wood[i]);
- }
- int left = 1; // 最小长度
- int right = maxLength; // 最大长度
- int result = 0; // 最大长度的最终结果
- while (left <= right) {
- int mid = (left + right) / 2;
- int count = 0; // 切割出来的小段木头数量
- for (int i = 0; i < n; i++) {
- count += wood[i] / mid;
- }
- if (count >= k) {
- result = mid;
- left = mid + 1;
- } else {
- right = mid - 1;
- }
- }
- cout << result << endl;
- return 0;
- }
复制代码
这样,就可以得到最大的小段木头长度l了。如果连1cm长的小段都切不出来,输出0。希望能帮到你!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|