python算法习题(十):木材加工

版权声明:本文为博主原创文章,欢迎转载,但请注明原文出处。 https://blog.csdn.net/GiveMeFive_Y/article/details/79961181

1. 题目

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

注意事项
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。

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

2. 思路

循环递增木头的根数直到满足要求。方式假如数量不够,根据截断N段后取剩余长度最大值的木头改变长度截成N+1段。

3. 代码

def woodCut(woods, num):
    length = max(woods)    # 初始化长度为最大值,也就是数量从1开始。
    while True:
        count = 0
        for wood in woods:
            count += wood//length  # 计算能够截断的段数
        if count >= num:          # 判断
            return length
        else:
            # 选出当前木头剩余长度最大的那根,改变长度使N+1
            ch_wood = max([(i, i%length) for i in woods], key=lambda x: x[1])[0]
            n = ch_wood // length
            length = ch_wood // (n+1)

print(woodCut([232, 124, 456], 7))
print(woodCut([232, 124, 456], 3))
print(woodCut([232, 124, 456], 2))
结果:
114
228
232

4. 总结

这里并不是傻瓜式的对木头每次减去单位长度再计算数量,而是有目的地改变长度使每次循环数量增加1。这样无疑效率提高了不少。只要思路搞懂了,代码其实挺简单的。快要离职了,没啥事做继续刷题。。。

猜你喜欢

转载自blog.csdn.net/GiveMeFive_Y/article/details/79961181
今日推荐