题目:例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。(题目默认输入的数字按从小到大排序)
这个就用到了哈夫曼编码,类似求权值最小的
#include<iostream>
#include<queue>
#include<vector>;
#include<functional>
using namespace std;
priority_queue<int ,vector<int> ,greater<int> > q;
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x; scanf("%d",&x);
q.push(x);
}
int ans=0;
while(n>1)
{
int t1=q.top(); q.pop();
int t2=q.top(); q.pop();
ans+=t1+t2;
q.push(t1+t2);
n--;
}
printf("%d\n",ans);
return 0;
}