農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數li 個長度單位,於是他購買了一條很長的、能鋸成n塊的木頭,即該木頭的長度是li 的總和。
但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度為8、7和5的三段,第一次鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度為12的木頭鋸成7和5,總花費為32。如果第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費為35(大於32)。
請編寫程式幫助農夫計算將木頭鋸成n塊的最少花費。
輸入首先給出正整數n(≤10e4 ),表示要將木頭鋸成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的木頭...