已知n个数,寻找一棵树,使得树的所有叶子结点的权值恰好为这n个数,并且使得这棵树的带权路径长度最小
①树的带权路径长度=所有叶子结点的带权路径长度之和
②带权路径长度=叶子结点的权值乘以其路径长度

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
priority_queue<ll, vector<ll>, greater<ll>> q;
int main(){
    int n;
    ll x, ans = 0;
    scanf("%d", &n);
    while(n--){
        scanf("%lld", &x);
        q.push(x);//将初始重量压入优先队列
    }
    while(q.size() > 1){//只要优先队列中至少有两个元素
        ll a = q.top();
        q.pop();
        ll b = q.top();
        q.pop();
        q.push(a + b);//取出堆顶的两个元素,求和后压入优先队列
        ans += a + b;//累计求和的结果
    }
    printf("%lld\n", ans);//ans即为消耗的最小体力
    return 0;
}