有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭,需要得到的小段的數目至少為 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...