版权声明:本文为博主原创文章,欢迎转载,但请注明原文出处。 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。这样无疑效率提高了不少。只要思路搞懂了,代码其实挺简单的。快要离职了,没啥事做继续刷题。。。