183. Wood Cut

今天刷题的时候遇到一个题目,题目不难,但是一时间没想出来怎么算,现在总结一下题目的想法。

题目描述:

Given n pieces of wood with length L[i] (integer array). Cut them into small pieces to guarantee you could have equal or more than k pieces with the same length. What is the longest length you can get from the n pieces of wood? Given L & k, return the maximum length of the small pieces.

 Notice
You couldn't cut wood into float length.

If you couldn't get >= k pieces, return 0.

Example
For L=[232, 124, 456], k=7, return 114.

题目分析:

    题目的意思就是给定一个数组L,数字k,将数组中的木头长度分成至少k段长度相同的木头,并且求分成小木头后其最大长度。

    可以写出两个函数,第一个函数为countPieces(vector<int> L, int len),输入数组L和长度len,返回最多可分为多少段。第二个函数为woodCut(vector<int> L, int k),输入数组长度L和最少分成的k段木头数,输出最终结果。在第二个函数中,可以采用二分法,先找出数组L中的木头最长的长度maxLen,然后设置shortest = 1,longest = maxLen,进行二分调用,每次需要调用countPieces测试分段总数是否大于等于k。此处需要注意,二分循环的条件是shortest+1<longest。

代码如下:

    

class Solution {
public:
    /**
     * @param L: Given n pieces of wood with length L[i]
     * @param k: An integer
     * @return: The maximum length of the small pieces
     */
    int woodCut(vector<int> &L, int k) {
        if(L.size()==0 || countPieces(L, 1)<k)
            return 0;
        int maxLen=1;
        for(int i=0;i<L.size();i++)
            maxLen=max(maxLen, L[i]);
        int shortest = 1, longest = maxLen;
        while(shortest+1<longest){
            int mid = shortest + (longest-shortest)/2;
            if(countPieces(L, mid)>=k)
                shortest = mid;
            else 
                longest = mid;
        }
        if(countPieces(L, longest)>=k)
            return longest;
        return shortest;
    }
    
private:
    long long countPieces(vector<int> &L, int len){
        long long pieces = 0;
        for(int i=0;i<L.size();i++)
            pieces += L[i]/len;
        return pieces;
        
    }

};
总结:

    题目不难,需要多思考,多动动脑筋。



猜你喜欢

转载自blog.csdn.net/vanturman/article/details/79454888
cut