合併果子(貪心演算法,優先佇列解決)

2021-10-11 11:12:32 字數 984 閱讀 9231

題目描述

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n−1 次合併之後, 就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為 1 ,並且已知果子的種類 數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有 3 種果子,數目依次為 1 , 2 , 9 。可以先將 1 、2 堆合併,新堆數目為 3 ,耗費體力為 3 。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為 12 ,耗費體力為 12 。所以多多總共耗費體力 3+12=15 。可以證明 15 為最小的體力耗費值。

輸入格式

共兩行。

第一行是乙個整數 n(1≤n≤10000) ,表示果子的種類數。

第二行包含 n個整數,用空格分隔,第 i 個整數 ai​ (1≤ai​ ≤20000) 是第 i 種果子的數目。

輸出格式

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

輸入樣例

312

9

輸出樣例

15
說明/提示

對於30%的資料,保證有n≤1000:

對於50%的資料,保證有n≤5000;

對於全部的資料,保證有n≤10000。

#include

using

namespace std;

intmain()

while

(q.size()

!=1) cout

}

合併果子 貪心 優先佇列

c 合併果子 crawling in process.crawling failed time limit 1000msmemory limit 131072kb64bit io format lld llu submit status description 現在有n堆果子,第i堆有ai個果子。現...

演算法 合併果子(優先佇列)

每次將最小的兩堆合併,然後將合併後的堆加入佇列。迴圈往復n 1次就可以將n堆合併為一堆。需要注意的是優先佇列的語法 priority queue type 為資料型別,container 為容器型別,functional就是比較的方式。公升序佇列 priority queue int,vector ...

合併果子(優先佇列)

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