148 合併果子

2021-09-29 23:45:57 字數 940 閱讀 9003

一道huffman樹問題,貪心在每一次合併堆的時候,都取最小的兩個堆合併。

用乙個優先佇列(小頂堆)來存下所有堆的資料,每次取前面兩個合併就可以了。

acwing282. 石子合併

設有n堆石子排成一排,其編號為1,2,3,…,n。

每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。

每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。

例如有4堆石子分別為 1 3 5 2, 我們可以先合併1、2堆,代價為4,得到4 5 2, 又合併 1,2堆,代價為9,得到9 2 ,再合併得到11,總代價為4+9+11=24;

如果第二步是先合併2,3堆,則代價為7,得到4 7,最後一次合併代價為11,總代價為4+7+11=22。

問題是:找出一種合理的方法,使總的代價最小,輸出最小代價。

輸入格式

第一行乙個數n表示石子的堆數n。

第二行n個數,表示每堆石子的質量(均不超過1000)。

輸出格式

輸出乙個整數,表示最小代價。

資料範圍

1≤n≤300

輸入樣例:

41 3 5 2

輸出樣例:

題目一模一樣,但是這道題的資料大小沒有現在做的大,這裡n=300,而上面一題n=1e5,所以dp不能做。

#include

#include

#include

;#include

using

namespace std;

intmain()

int res=0;

while

(heap.

size()

>1)

cout << res;

}

Acwing148 合併果子(哈夫曼問題 小根堆)

原題鏈結 在乙個果園裡,達達已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。達達決定把所有的果子合成一堆。每一次合併,達達可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。達達在合併果子時總共消耗的體力等於每次合併所耗...

合併果子(multiset)

time limit 1 sec memory limit 128 mb submit 312 solved 113 submit status web board 現在有n堆果子,第i堆有ai個果子。現在要把這些果子合併成一堆,每次合併的代價是兩堆果子的總果子數。求合併所有果子的最小代價。第一行包...

swustoj合併果子

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...