每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值
我的思路:堆,排序+贪心
#include<iostream>
using namespace std;
int h[100000];
int size,sum,f1,f2;
void push(int data)
{
size++;
int i=size,pa;
while (i>1)
{
pa=i/2;
if (h[pa]<=data) break;
h[i]=h[pa];
i=pa;
}
h[i]=data;
}
int pop()
{
int l,r,tmp=h[1],i=1,x=h[size];
size--;
while (i*2<=size)
{
l=i<<1;
r=l+1;
if (r<=size&&h[r]<h[l]) l=r;
if (x<=h[l]) break;
h[i]=h[l];
i=l;
}
h[i]=x;
return tmp;
}
int main()
{
int n;
cin>>n;
int tmp;
for (int i=1;i<=n;i++)
{
cin>>tmp;
push(tmp);
}
for (int i=1;i<=n-1;i++)
{
f1=pop();
f2=pop();
push(f1+f2);
sum+=f1+f2;
}
cout<<sum;
}