UVA10954 Add All 类似合并果子 STL优先队列(创建和应用) 贪心大法

20 篇文章 1 订阅
这篇博客介绍了一个利用贪心算法和优先队列解决的编程问题:如何以最小消耗合并所有数字。作者首先提到因为不熟悉STL导致的初次错误,然后详细解释了优先队列(特别是小于号前需要空格的细节)的优势,并给出了AC代码。代码中,通过创建一个小顶堆,不断合并堆顶两个最小的数并重新入堆,直至只剩下一个数,最终输出消耗的总和。
摘要由CSDN通过智能技术生成

题目

题目地址
合并两个数要消耗他们的和,我们要把所有数合并,要求消耗最小。

题解思想

非常明显的贪心,但由于不熟练STL最开始我只想着排序一次做,这样忽略了每次的最小值可能会更新,这样就导致的第一次的WA。优先队列的好处在于代码量小,而且每次都会更新队列。这样我们取一个由小到大的优先队列,每次取出第一 二个相加再将其之和入队即可。 再用一个变量加上每次合并的值最后输出即可。
创建优先队列操作(注意第二个操作的大于号前要空格)

priority_queue<int> a; //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>,greater<int> > b; //通过操作,按照元素从小到大的顺序出队

基操(这个要熟悉)
empty() 如果队列为空,则返回为真

pop() 删除队顶元素,删除第一个元素

push() 添加 一个元素

size() 返回优先队列中的元素个数

top() 返回优先队列的队顶,即返回优先队列中具有最高级的元素

AC代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
//优先队列
int main ()
{
    int n;
    priority_queue<int,vector<int>,greater<int> > m;
    while(scanf("%d",&n))
    {
        if(n==0)
            return 0;
        for(int i=1;i<=n;i++)
         {
             int j;
             scanf("%d",&j);
             m.push(j);
         }
         int sum=0;
         while(m.size()!=1)
         {
             int a,b;
             a=m.top();
             m.pop();
             b=m.top();
             m.pop();
             sum+=a+b;
             m.push(a+b);
         }
         m.pop();
         printf("%d\n",sum);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值