利用堆维护:每次从堆里取两个最小加起来,然后还是最小的两个,最后只剩一根总的
#include <bits/stdc++.h> using namespace std; typedef long long LL; priority_queue<LL, vector<LL>, greater<LL> >q; // 定义小的先出队 int main() { while(!q.empty()) q.pop(); LL x,y,z; int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&x); q.push(x); } LL ans=0; while(q.size()>1) { x=q.top();q.pop(); y=q.top();q.pop(); z=x+y; q.push(z); ans=ans+z; } printf("%lld ",ans); return 0; }