list容器的一些简单操作

今天做到一题,例如有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
#include
#include
#include
using namespace std;//list容器是一个双向链表
list 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()     {
        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 {
    int temp;
    cin>>temp;
    a.push_back(temp);
}
a.sort();//默认顺序是递增,头是最小值
int sum=0;
for(int i=0;i {int ans;
    ans=get()+get();
    b.push_back(ans);
    sum+=ans;
}
cout< }


    return 0;
}


有一个疑问是list的sort函数能否自己编写,应该如何编写,希望懂的大牛能点拨一下

你可能感兴趣的:(list容器)