1. 程式人生 > >P2-2017級演算法第二次上機 B 女媧加農炮

P2-2017級演算法第二次上機 B 女媧加農炮

題目描述

(請不要帶著科學的視角去看待題幹故事,因為這本來就是以遊戲為背景的)

女媧加農炮是中國陣營的專屬T3戰車單位。這種裝備了250mm口徑核裂變重磅炮的鋼鐵巨獸是一種極為恐怖的屠戮機器,常常被安置在中國大批機械化部隊的最前端,形成一堵堅不可摧、勢不可擋的鋼鐵長城。

表面上女媧加農炮是由東北重工集團研製而成,但事實上,東北重工只進行了方案論證和實車建造,女媧加農炮真正的締造者,是來自中國的天才科學家芸如。

現在芸如想化核裂變為核聚變,從而讓女媧加農炮的火力再上一層樓。已知有N種不同的原子核(這裡請忽略自然界原子核的種類上限),第i種原子核的重量為a[i]

將兩種原子核聚合在一起,消耗的能量等於兩種原子核的重量之和。在經過

n-1次聚合之後,聚合完成。芸如想使整個聚合過程消耗的能量最小,請求出這個最小的能量值。

輸入

多組資料輸入,第一個數為原子核的種類N。(N<=1e6

接下來N個整數,代表N種原子核的重量。(在int範圍內並用空格隔開)

輸出

對於每組資料,輸出一行,為聚合過程能量消耗的最小值。(保證結果在int範圍內)

輸入樣例

4

1 2 3 4

輸出樣例

19

思路

利用優先佇列,每次將最小的兩個從優先佇列中取出並加和,然後將加和之後的元素重新放回優先佇列並維護即可。最後輸出累加值即為所求。

參考程式碼

 1 #include<iostream>  
 2
#include<cstdio> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 priority_queue<int,vector<int>,greater<int> >q; 7 int main() 8 { 9 int N; 10 while(scanf("%d",&N) == 1){ 11 //優先佇列 12 while(!q.empty())
13 q.pop(); 14 int res = 0,weight; 15 for(int i = 0;i < N;i++){ 16 scanf("%d",&weight); 17 q.push(weight); 18 } 19 for(int i = 1;i < N;i++){ 20 int first = q.top(); 21 q.pop(); 22 int second = q.top(); 23 q.pop(); 24 q.push(first+second); 25 res += first + second; 26 } 27 printf("%d\n",res); 28 } 29 }