今天做到一题,例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以水獭总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
题解上涉及到用huffman树构造,不是很懂,又得知可以用list容器,更加简单
list是一个双向链表,因此此题我只需要申请list容器a,b,a按升序排序,然后不停地取a和b中的最小值,然后把每次取到的两个最小值之和存在b容器里
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <list>
using namespace std;//list容器是一个双向链表
list<int> a,b;
int get()
{int ans;
if(a.empty())
{ans=b.front();
b.pop_front();
return ans;
}
if(b.empty())
{
ans=a.front();
a.pop_front();
return ans;
}
if(a.front()<b.front())
{
ans=a.front();//取头即最小值
a.pop_front();//删除头
return ans;
}
else
{
ans=b.front();
b.pop_front();
return ans;
}
}
int main()
{//freopen("E:\\in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{for(int i=0;i<n;i++)
{
int temp;
cin>>temp;
a.push_back(temp);
}
a.sort();//默认顺序是递增,头是最小值
int sum=0;
for(int i=0;i<n-1;i++)
{int ans;
ans=get()+get();
b.push_back(ans);
sum+=ans;
}
cout<<sum<<endl;
}
return 0;
}
有一个疑问是list的sort函数能否自己编写,应该如何编写,希望懂的大牛能点拨一下