codeforce884 D. Boxes And Balls 構造哈夫曼樹求解合併最小費用
阿新 • • 發佈:2018-12-16
給定n個球,每個球有一定價值,求將其按照價值的分類的最小价值
逆過程:將n個一定價值的球合併到一起的最小費用,構造哈夫曼樹:帶權路徑長度最短的樹,權值較大的結點離根較近
#include<bits/stdc++.h> using namespace std; const int MAX=2e5+5; int n; priority_queue<long long,vector<long long>,greater<long long> >q; int main() { long long x; while(~scanf("%d",&n)) { while(!q.empty()) q.pop(); for(int i=0;i<n;++i){scanf("%lld",&x);q.push(x);} if((n&1)==0) q.push(0); long long ans=0; while(q.size()>1) { x=q.top();q.pop(); x+=q.top();q.pop(); x+=q.top();q.pop(); q.push(x); ans+=x; } printf("%lld\n",ans); } return 0; }