题目链接: 点这里
方法一(使用set):
由于set基于红黑树实现, 本身是有序的, 所以可以通过begin()函数获得最小值, 在通过erase()消除已经取出最小值
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
// 使用pair防止set自动去重, second为时间戳
typedef pair<int, int> PII;
int main() {
set<PII> s;
int n, t = 0;
cin >> n;
for (int i = 0, a; i < n; i++) {
cin >> a;
s.insert(PII(a, t++));
}
int sum = 0;
for (int i = 1; i < n; i++) {
int a = (s.begin())->first; // 取出最小值
s.erase(s.begin()); // 消去最小值
int b = (s.begin())->first;
s.erase(s.begin());
sum += a + b;
s.insert(PII(a + b, t++));
}
cout << sum << endl;
return 0;
}
方法二(使用priority_queue):
priority_queue使用参考
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <queue>
using namespace std;
int main() {
priority_queue<int, vector<int>, greater<int> >q; // 使用小顶堆, 如果使用大顶堆用less<int>
int n;
cin >> n;
for (int i = 0, a; i < n; i++) {
cin >> a;
q.push(a);
}
int sum = 0;
while (q.size() > 1) {
int a = q.top(); q.pop();
int b = q.top(); q.pop();
sum += a + b;
q.push(a + b);
}
cout << sum << endl;
return 0;
}