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

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

題目描述

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

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

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

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

將三種原子核聚合在一起,消耗的能量等於三種原子核的重量之和。在經過多次聚合之後,聚合完成。(如果原子核的數量小於

3則不進行進一步的聚合)芸如想使整個聚合過程消耗的能量最小,請求出這個最小的能量值。

輸入

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

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

輸出

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

輸入樣例

4
1 2 3 4

輸出樣例

6

思路

同優先佇列題目,每次將最小的三個從優先佇列中取出並加和,之後將加和之後的元素重新放回優先佇列並維護即可。最後輸出累加值即為所求。需要注意數量小於3時無法合併。

參考程式碼

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