LintCode : 木材加工

来源:互联网 发布:seo常用查询方法 编辑:程序博客网 时间:2024/04/27 16:39

LintCode : 木材加工

题目

有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。

样例

有3根木头[232, 124, 456], k=7, 最大长度为114.

思路

首先我们先找到可能的最大长度,也就是所有木头长度的总和除最小段。然后我们用二分查找去寻找满足k的最大长度。因为要求最大长度,所以可能会有不同的长度满足相同的小段数。所以我们的判停条件为minlen < maxlen。同时因为设置的maxlen是满足最小段大于k的所以二分的时候midlen = (minlen + maxlen + 1)/ 2而不是(minlen + maxlen)/ 2,不知道有没有小伙伴会像我一样犯这样的错误,所以先写在这,具体代码如下(对了,因为求和的缘故,所以中间变量使用long long防止溢出)。

代码

int woodCut(vector<int> L, int k) {    long long alllen = 0;    for(long long i = 0; i < L.size(); i++) {        alllen += L[i];    }    long long maxlen = alllen / k;    long long minlen = 0;     while(minlen < maxlen) {        if(maxlen == 0) {            return 0;        }        long long midlen = (minlen + maxlen + 1) / 2;        long long segment = 0;        for(long long i = 0; i < L.size(); i++) {            segment += L[i] / midlen;        }        if(segment >= k && minlen != midlen) {            minlen = midlen;        }        else {            maxlen = midlen - 1;        }    }    return minlen;
0 0