思路:看到这个题就应该想到哈夫曼树,每一次都应该取最短的两根绳子进行串连,这样每次的损失才会最小。
#include<bits/stdc++.h>
using namespace std;
int n;
//哈夫曼树最好用优先队列做,用着非常爽,复杂度也是O(n*logn)的
priority_queue<int,vector<int>,greater<int> >pq;
void solve(){
cin>>n;
int m,ans;
for(int i=0;i<n;i++){
cin>>m;
pq.push(m);
}
while(!pq.empty()){
int x1=pq.top();
pq.pop();
int x2=pq.top();
pq.pop();
if(pq.empty()){
cout<<(x1+x2)/2<<endl;
break;
}
pq.push((x1+x2)/2);
}
}
int main(){
//freopen("in.txt","r",stdin);
solve();
return 0;
}