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;