已知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; }