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 <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函数能否自己编写,应该如何编写,希望懂的大牛能点拨一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值