首页 > 试题广场 >

切割木头

[编程题]切割木头
  • 热度指数:641 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的数组,数组中的元素表示每个木头的长度,木头可以在任意位置截断。从这些木头中取出至少 k 个长度都为 m 的木头。请问 m 最大是多少。

数据范围:数组长度满足 ,木头长度满足 ,
示例1

输入

[1,2,3,4,5],3

输出

3
示例2

输入

[1,2,3,4,5],5

输出

2
示例3

输入

[1,2,3,4,5],7

输出

1
import java.util.*;

public class Solution {
    /**
     *  二分法
     */
    public int cutWood (ArrayList<Integer> a, int k) {
        Collections.sort(a, Comparator.reverseOrder());
        int left = a.get(a.size() - 1), right = a.get(0);
        while (left < right) {
            int mid = left + (right - left + 1) / 2;
            if (canCut(a, mid, k)) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
    
    private boolean canCut(ArrayList<Integer> a, int m, int k) {
        if (k == 0) return true;
        for (int i = 0; i < a.size() && a.get(i) >= m; i++) {
            int cur = a.get(i);
            if (cur >= m) {
                while (cur >= m) {
                    cur -= m;
                    k--;
                    if (k <= 0) return true;
                }
            } else {
                return false;
            }
        }
        return false;
    }
}

发表于 2022-08-01 15:54:45 回复(0)

问题信息

难度:
1条回答 936浏览

热门推荐

通过挑战的用户

查看代码