题目:
(1)题目大意:给定一个集合(包含n个数),每次拿两个求和,记为Si,再把Si放入这个集合,依次类推,把n个数加完为止,要求输出的最小值
(2)思路:每次选取最小的两个值相加,这样求得的结果最小
(3)实现方法:1、每次把Si放入集合后,就排序一次(次数太多,会超时) 2、用优先队列
(4)代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int n;
while (scanf("%d", &n) && n) {
priority_queue<int, vector<int>, greater<int>>q; //小数据的优先级高的优先队列
ll sum = 0; //储存结果
for(int i = 0; i < n; i++){
int x;
scanf("%d", &x);
q.push(x);
}
for(int i = 0; i < n - 1; i++) { //求和n - 1次
int temp= 0;
temp += q.top();
q.pop();
temp += q.top();
q.pop();
q.push(temp);
sum += temp;
}
printf("%lld\n", sum); //输出
}
return 0;
}
//先看后赞是好习惯哦~