description
小明發現單吃一種藥效果太差,他要將已有的n種藥物混合成1種藥再吃。已知每種藥都有一定的毒性,將任意兩種藥混合的毒性為這兩種藥的毒性之和,混合產生的新藥的毒性也同樣為兩種藥的毒性之和。由於技術限制,小明每次只能挑選兩種藥進行混合。現在小明想知道將n種藥合成1種藥的最小毒性和。
input
輸入第一行為乙個正整數n(1 <= n <= 100000)
接下來一行輸入n個正整數,第i個整數a[i]代表第i種藥的毒性( 1 <= a[i] <= 1000)
output
輸出一行乙個整數,代表藥的最小毒性和。
sample input
51 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個果子。現...