python演算法習題(十) 木材加工

2021-08-18 20:41:24 字數 1047 閱讀 7793

有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭,需要得到的小段的數目至少為 k。當然,我們希望得到的小段越長越好,你需要計算能夠得到的小段木頭的最大長度。

注意事項

木頭長度的單位是厘公尺。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也要求是整數。無法切出要求至少 k 段的,則返回 0 即可。

樣例:

有3根木頭[232, 124, 456], k=7, 最大長度為114.

迴圈遞增木頭的根數直到滿足要求。方式假如數量不夠,根據截斷n段後取剩餘長度最大值的木頭改變長度截成n+1段。

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

228232

這裡並不是傻瓜式的對木頭每次減去單位長度再計算數量,而是有目的地改變長度使每次迴圈數量增加1。這樣無疑效率提高了不少。只要思路搞懂了,**其實挺簡單的。快要離職了,沒啥事做繼續刷題。。。

木材加工(裸二分題)(附二分演算法粗略介紹)

看到旁邊的學弟也在做二分,就手賤2分鐘打了一道奇 sha 特 bi 二分題。原題傳送門 好吧,做這道題是為了給新手乙個教程 首先我們聊聊二分。二分利用的也是分治思想 不懂分治思想的可以看看我歸併做的那道火柴排隊。傳送門首先要了解一下二分的性質 也就是什麼題目要用二分來寫 我們假設乙個題目,如果乙個數...

python經典練習題十道 六

1 設計簡單計算器 定義函式 def add x,y 相加 return x y def subtract x,y 相減 return x y def multiply x,y 相乘 return x y def divide x,y 相除 return x y 使用者輸入 print 選擇運算 p...

python練習題之演算法(二)

1.奇偶數,10以內偶數之和 add 0 for i in range 0,11 if i 2 0 add i print add 2.質數 1 100的之間的質數 for i in range 1,101,1 for j in range 2,i 1,1 if i j 0 break else p...