題目:例如有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;
}