题目传送门:
https://www.luogu.com.cn/problem/P1090https://www.luogu.com.cn/problem/P1090本题可以使用优先队列实现
优先队列,就是默认排序的堆。
自动排序的优先队列(大者在顶端):
priority_queue<int> q;
当要使小者在顶端时:
priority_queue<int, vector<int>, greater<int> > q;
优先队列常用操作:
pop()
push()
top()
empty()
size()
本题中需要使用小顶堆,就是:
priority_queue<int, vector<int>, greater<int> > q;
首先输入n个x,将x们推入到q中;
接下来,判断当q.size()大于1时,把顶端两个加和(顶端两个最小,贪心策略);
再将加和的值用s加和,到最终就是答案;
每一步将两个top()的值的和推入q中,继续寻找前二小的值。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, x, s;
priority_queue<int, vector<int>, greater<int> > q; //小顶堆,小的在top
signed main () {
cin >> n;
while (n--) {
cin >> x;
q.push(x);
}
while (q.size() > 1) {
int t = q.top(); q.pop();
t += q.top(); q.pop();
s += t;
q.push(t);
}
cout << s;
return 0;
}
AC