木材加工-LintCode

来源:互联网 发布:上海百胜软件 编辑:程序博客网 时间:2024/04/27 15:57

有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。
注意事项:
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。
样例:
有3根木头[232, 124, 456], k=7, 最大长度为114.
挑战 :
O(n log Len), Len为 n 段原木中最大的长度

#ifndef C183_H#define C183_H#include<iostream>#include<vector>#include<algorithm>using namespace std;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) {        // write your code here        if (L.empty())            return 0;        long long  sum = 0;        for (auto c : L)            sum += c;        if (sum < k)            return 0;        sort(L.begin(), L.end());        long long left = 1;        long long right = L[L.size() - 1];        while (left < right)        {            long long  mid = (left + right + 1) >> 1;            if (judge(L, k, mid))                left = mid;            else                right = mid - 1;        }        return left;    }    bool judge(vector<int> v, int k, long long size)    {        long long  num = 0;        for (auto c : v)            num += c / size;        return num >= k;    }};#endif