合併果子(優先佇列)

2021-08-02 21:13:58 字數 1205 閱讀 2760

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

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n−1

n−1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為1

1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有3

3種果子,數目依次為11,2

2,99。可以先將11、2

2堆合併,新堆數目為3

3,耗費體力為3

3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12

12,耗費體力為12

12。所以多多總共耗費體力3+12

=153+12=15

。可以證明15

15為最小的體力耗費值。

input

輸入包括兩行,第一行是乙個整數nn(1

≤n≤10000

1≤n≤10000

),表示果子的種類數。第二行包含n

n個整數,用空格分隔,第i

i個整數aiai

(1≤ai

≤20000

1≤ai≤20000

)是第i

i種果子的數目。

output

輸出包括一行,這一行只包含乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於2

31231

。sample input

3 

1 2 9

sample output
15

思路:每次取最小的兩個數合併結果加入其中,刪除這兩個數,求最後的結果。   使用優先佇列可以快速解決這個問題

#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=10005;

priority_queue,greater>pq;

int a[maxn];

int main()

printf("%d\n",ans);

return 0;

}

合併果子優先佇列

合併果子 每次取出兩個最小的,求和之後再放進去,再取出兩個最小的,依次進行下去。當然,每次取出之後都需要累加兩個數。本文使用優先佇列,也就是最小堆實現 typedef long long ll priority queue ll,vector greater pq 從小到大排序優先佇列的大小大於1p...

合併果子 貪心 優先佇列

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 ...