列表

详情


NC382. 切割木头

描述

给定一个长度为 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 7ms, 内存消耗: 828KB, 提交时间: 2022-05-19

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int cutWood(vector<int>& a, int k) {
        // write code here
        sort(a.begin(), a.end(), greater<int>());
        auto check = [&](int v) {
            int ans = 0;
            for (auto &i : a) {
                ans += i / v;
                if (ans >= k) {
                    return true;
                }
            }
            return false;
        };
        int l = 1, r = a[0];
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (check(mid)) l = mid;
            else r = mid - 1;
        }
        return r;
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 828KB, 提交时间: 2022-05-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int cutWood(vector<int>& a, int k) {
        int maxNum = 0;
        for (auto &val : a) {
            maxNum = max(maxNum, val);
        }
        int res = 0;
        int left = 1, right = maxNum;
        while (left <= right) {
            int mid = (left + right) / 2;
            int count = 0;
            for (int i = 0; i < a.size(); i++) {
                count += a[i] / mid;
            }
            if (count >= k) {
                left = mid + 1;
                res = mid;
            } else {
                right = mid - 1;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 8ms, 内存消耗: 792KB, 提交时间: 2022-07-02

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int cutWood(vector<int>& a, int k) {
        // write code here
        sort(a.begin(),a.end());
        int left=1,right=a.back();
        while(left<right)
        {
            int mid=left + (right - left + 1) / 2;
            int ans=help(a,mid);
            if(ans>=k)
            {
                left=mid;       
            }
            else
            {
                right=mid-1;
            }
        }
        return left;
    }
    int help(vector<int> a,int mid)
    {
        int cnt=0;
        for(int i=a.size()-1;i>=0;i--)
        {
            if(a[i]<mid)
                break;
            cnt+=(a[i]/mid);
        }
        return cnt;
    }
};

C++ 解法, 执行用时: 8ms, 内存消耗: 796KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int get_max(std::vector<int>& a, int len) {
        int res = 0;
        for(auto& t : a) {
            res += (t / len);
        }
        return res;
    }
    int cutWood(vector<int>& a, int k) {
        // write code here
        int l = 1, r = *max_element(a.begin(), a.end());
        while(l <= r) {
            int len = l + (r - l) / 2;
            int num = get_max(a, len);
            if(num >= k) l = len + 1;
            else r = len - 1;
        }
        return r;
    }
};

C++ 解法, 执行用时: 8ms, 内存消耗: 804KB, 提交时间: 2022-07-18

class Solution {
  public:
    int cutWood(vector<int>& a, int k) {
        sort(a.begin(), a.end(), greater<int>());
        
        auto c = [&](int v) {
            int y = 0;
            for (auto& i : a) {
                y += i / v;
                if (y >= k) {
                    return true;
                }
            }
            return false;
        }; 
        
        int l = 1, r = a[0];
        while (l < r) {
            int z = l + r + 1 >> 1;
            if (c(z)) l = z;
            else r = z - 1;
        }
        return r;
    }
};

上一题