農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數li 個長度單位,於是他購買了一條很長的、能鋸成n塊的木頭,即該木頭的長度是li的總和。
但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度為8、7和5的三段,第一次鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度為12的木頭鋸成7和5,總花費為32。如果第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費為35(大於32)。
請編寫程式幫助農夫計算將木頭鋸成n塊的最少花費。
輸入格式:
輸入首先給出正整數n(≤10
4 ),表示要將木頭鋸成n塊。第二行給出n個正整數(≤50),表示每段木塊的長度。
輸出格式:
輸出乙個整數,即將木頭鋸成n塊的最少花費。
輸入樣例:
84 5 1 2 1 3 1 1
輸出樣例:
49
#include
#include
#define maxdata -10
//定義哨兵
typedef
int elementtype;
typedef
struct treenode *huffmantree;
struct treenode
;typedef
struct heapstruct *minheap;
struct heapstruct
;minheap creates
(int maxsize)
;int
huffman
(minheap h)
;elementtype deletemin
(minheap h)
;void
insert
(minheap h,elementtype item)
;int
isempty
(minheap h)
;int
isfull
(minheap h)
;int
main()
int p=
huffman
(h);
printf
("%d"
,p);
return0;
}int
huffman
(minheap h)
return sum;
}//最小堆
elementtype deletemin
(minheap h)
maxitem = h->elements[1]
;//取出結點
//用最大堆中的乙個元素從根結點向上過濾下層節點,調整
temp = h->elements[h->size--];
//判斷有沒有左右孩子
for(parent =
1;parent*
2<= h->size;parent=child)
h->elements[parent]
= temp;
return maxitem;
}int
isempty
(minheap h)
//最小堆的插入
void
insert
(minheap h,elementtype item)
i =++h->size;
//i指向插入後堆中的最後乙個元素,並對size加1
/*比較父結點,如果放到最-xiao-,就會有哨兵,
這個哨兵就是最-xiao-的,讓他不會在比較了。如果不用哨兵,就要加乙個&&i>1*/
for(
;h->elements[i/2]
>item;i/=2
) h->elements[i]
=item;
//插入item
}int
isfull
(minheap h)
minheap creates
(int maxsize)
這個題主要是將輸入的資料進行公升序排序後,每次找前兩個最小的數經行相加,得到兩數和sum,並從序列中刪除這兩個數。然後在將這個sum插入公升序序列中。然後重複操作直到序列中只剩下乙個數。然後將這裡所有的sum求和就是答案了。
可以看出這就是利用最小堆構建哈夫曼樹,求哈夫曼樹所有非葉結點的和了。
用最小堆是因為利用最小堆方便插入sum,和刪除資料。其時直接進行排序也是一樣的。
我寫的這個**有點冗餘,是因為我直接改寫了以前寫好的哈夫曼樹。
7 1 修理牧場 25 分 (C語言實現)
農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是li 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成...
5 29 修理牧場 25分
農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數li i 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是li 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭...
5 5 修理牧場 25分
5 5 修理牧場 25分 農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要nn塊木頭,每塊木頭長度為整數l il i 個長度單位,於是他購買了一條很長的 能鋸成nn塊的木頭,即該木頭的長度是l il i 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於...