合併果子 貪心 優先佇列

2021-07-09 14:20:16 字數 1028 閱讀 2551

c -合併果子

crawling in process...

crawling failed

time limit:1000msmemory limit:131072kb64bit io format:%lld & %llu

submit

status

description

現在有n堆果子,第i堆有ai個果子。現在要把這些果子合併成一堆,每次合併的代價是兩堆果子的總果子數。求合併所有果子的最小代價。

input

第一行包含乙個整數t(t<=50),表示資料組數。

每組資料第一行包含乙個整數n(2<=n<=1000),表示果子的堆數。

第二行包含n個正整數ai(ai<=100),表示每堆果子的果子數。

output

每組資料僅一行,表示最小合併代價。

sample input

2

41 2 3 4

53 5 2 1 4

sample output

19

33

hint

優先佇列的應用,實際上就是相當於一種哈夫曼演算法,每次取最小的兩堆進行合併,將合併後的那堆同樣放入其中進行大小比較。關於優先佇列,可以參考

#include#include#includeusing namespace std;

int main()

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

}return 0;

}

第一次使用優先佇列做題,其中有兩點需要注意:

priority_queue,greater>q;中的最後兩個》中間要有乙個空格;
取佇列中的元素是q.top(),而不是q.front()。

合併果子(優先佇列)

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

合併果子優先佇列

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

Vijos P1097 合併果子(優先佇列 貪心)

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