1270 藥不能停 合併果子,優先佇列,堆)

2021-08-15 16:37:34 字數 751 閱讀 9708

description

小明發現單吃一種藥效果太差,他要將已有的n種藥物混合成1種藥再吃。已知每種藥都有一定的毒性,將任意兩種藥混合的毒性為這兩種藥的毒性之和,混合產生的新藥的毒性也同樣為兩種藥的毒性之和。由於技術限制,小明每次只能挑選兩種藥進行混合。現在小明想知道將n種藥合成1種藥的最小毒性和。

input

輸入第一行為乙個正整數n(1 <= n <= 100000) 

接下來一行輸入n個正整數,第i個整數a[i]代表第i種藥的毒性( 1 <= a[i] <= 1000)

output

輸出一行乙個整數,代表藥的最小毒性和。

sample input

5

1 2 3 4 5

sample output

33

這題屬於合併果子裡的經典問題,思路是貪心,堆(優先佇列)。

建堆o(n) (t(n)=t(n/2)+o(n))  插入,刪除操作o(logn).

#include #include using namespace std;

priority_queue , greater>q;

int main(void)

cout << ans << endl;

return 0;

}

合併果子(優先佇列)

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

合併果子優先佇列

合併果子 每次取出兩個最小的,求和之後再放進去,再取出兩個最小的,依次進行下去。當然,每次取出之後都需要累加兩個數。本文使用優先佇列,也就是最小堆實現 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個果子。現...