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
",res);  
30     }  
31 }  
原文地址:https://www.cnblogs.com/zjsyzmx0527/p/10188416.html