2 5 修理牧場 優先佇列 最小堆

2021-10-11 09:31:44 字數 1226 閱讀 8591

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l​i​​ 個長度單位,於是他購買了一條很長的、能鋸成n塊的木頭,即該木頭的長度是l​i​​ 的總和。

但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度為8、7和5的三段,第一次鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度為12的木頭鋸成7和5,總花費為32。如果第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費為35(大於32)。

請編寫程式幫助農夫計算將木頭鋸成n塊的最少花費。

輸入首先給出正整數n(≤10e​4​​ ),表示要將木頭鋸成n塊。第二行給出n個正整數(≤50),表示每段木塊的長度。

輸出乙個整數,即將木頭鋸成n塊的最少花費。

845

1213

11

49
2-5 修理牧場 (35 分)【優先佇列】

7-1 修理牧場 (25 分)(c語言實現)

2-5 修理牧場 (35分)

開始寫**了!!!

哦~~,優先佇列這是第一次見,哦不,這是第一次聽說啊!

我也不太明白這到底算是怎麼回事啊?

但是大家都是這麼寫的,這應該就是最簡單的方法了吧,雖然c語言也可以實現,但是我可懶得去寫。

還是在自己留著消化吧。

大概的意思就是,一塊木頭被鋸成兩段,這個木頭長多少就花多少錢。所以按照我們需要鋸成的長度排序,從大到小,先把大的給完成了,再依次解決較大的木頭,這樣會使總費用最少。

但是題目給的是每乙個分段的長度,倒著來思考這個題目的意思,那就是,先把最小的兩個給合併了,加起來再放進去,重新排序,再取出兩個最小的給合併,,,直到只剩乙個數了,就是最小值了。

2021.6.9回頭看

#

include

#include

//優先佇列的標頭檔案誒

using

namespace std;

intmain()

int sum=

0,x,y;

//x,y取當前佇列中的最小值

while

(!q.

empty()

) cout

}

最小堆實現優先佇列解決修理牧場 c c

修理牧場 農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要 n塊木頭,每塊木頭長度為整數l i 個長度單位,於是他購買了一條很長的 能鋸成 n塊的木頭,即該木頭的長度是l i 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長...

修理牧場 優先順序佇列

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數li個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是li的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度...

7 29 修理牧場 25分 優先佇列 貪心演算法

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l i 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭...