每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過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;
}