1107 搬水果(大根堆的構建)

2022-04-17 15:21:18 字數 937 閱讀 1377

在乙個果園裡,小明已經將所有的水果打了下來,並按水果的不同種類分成了若干堆,小明決定把所有的水果合成一堆。每一次合併,小明可以把兩堆水果合併到一起,消耗的體力等於兩堆水果的重量之和。當然經過 n‐1 次合併之後,就變成一堆了。小明在合併水果時總共消耗的體力等於每次合併所耗體力之和。

假定每個水果重量都為 1,並且已知水果的種類數和每種水果的數目,你的任務是設計出合併的次序方案,使小明耗費的體力最少,並輸出這個最小的體力耗費值。例如有 3 種水果,數目依次為 1,2,9。可以先將 1,2 堆合併,新堆數目為3,耗費體力為 3。然後將新堆與原先的第三堆合併得到新的堆,耗費體力為 12。所以小明總共耗費體力=3+12=15,可以證明 15 為最小的體力耗費值。

每組資料輸入包括兩行,第一行是乙個整數 n(1<=n<=10000),表示水果的種類數,如果 n 等於 0 表示輸入結束,且不用處理。第二行包含 n 個整數,用空格分隔,第 i 個整數(1<=ai<=1000)是第 i 種水果的數目。

對於每組輸入,輸出乙個整數並換行,這個值也就是最小的體力耗費值。輸入資料保證這個值小於 2^31。

3

9 1 2

0

15
#include#include

using

namespace

std;

priority_queue

,greater > q; //

構建大根對!!! 如果是小跟對就用less

intmain()

for(int i=0;i)

int sum=0

;

while(q.size()>1

) printf(

"%d\n

",sum);

}return0;

}

python用heapq模組構建大根堆

python的heapq模組可以快速構建堆。只是heapq只能構建小根堆,不能構建大根堆。import heapq data2 1,5,3,2,9,5 heapq.heapify data2 print data2 輸出 1,2,3,5,9,5 大根堆的做法 import heapq ll 1,4,...

堆 大根堆和小根堆的建立

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。1 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆。1 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆。用堆的關鍵部分是兩個操作 1 put操作 即往堆...

對大根堆的理解

首先 將陣列看成樹,由於大根堆輸出的元素是由小到大的,每次調整堆,都將根元素 即最大的元素 移到葉節點處 我的理解是,大根堆只是剛開始根的最大的,一次遞迴將最大元素放到葉節點之後,根元素是最小元素,輸出類似按樹的每一層輸出 eg 結果如下所示 初始 初建堆 大根堆 結果 例如 最大的元素與最後乙個葉...