这道题很容易想到优先把两堆重量最小的合并比较优 然后乱搞一下就可以啦
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include#include #include #include using namespace std;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}int n;struct node{ int w; bool operator<(const node&x)const{ return x.w q;int main(){ int ans; n=read(); for(int i=1;i<=n;i++) q.push((node){read()}); while(1){ node x=q.top(); ans=x.w; q.pop(); if(q.empty()){printf("%d\n",tot); return 0;} node y=q.top(); ans+=y.w; q.pop(); q.push((node){ans}); tot+=ans; } return 0;}