#include<stdio.h>
#include<queue>
using namespace std;
int main() {
priority_queue<long long, vector<long long>, greater<long long> > q;//用这个定义小堆
long long n;
scanf("%lld", &n);
while (n--) {
long long t;
scanf("%lld", &t);
q.push(t);
}
//小堆顶端就是最小值
long long sum = 0;//花费
int pair = 0;//标识是否已经弹出两个数
long long t = 0;//保存第一个被弹出的数字
while (!q.empty()) {
if (pair == 0) {
t=q.top();
q.pop();
pair = 1;
}
if (pair == 1) {
if (!q.empty()) {
sum += (q.top() + t);//第一个数字和第二个数字相加
t = q.top() + t;//将t修改为一会儿要压入的数字
q.pop();
q.push(t);
pair = 0;
}
}
}
printf("%lld", sum);
return 0;
}
POJ-3253
最新推荐文章于 2022-03-08 09:19:38 发布