7 19 修理牧場 25分 (C語言實現)

2021-10-05 11:39:42 字數 2367 閱讀 9714

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要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(≤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 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於...