合并果子(优先队列 +或者+哈夫曼)

合并果子

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 312  Solved: 113
[Submit][Status][Web Board]

Description

现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。

Input

第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。

Output

每组数据仅一行,表示最小合并代价。

Sample Input

2
4
1 2 3 4
5
3 5 2 1 4

Sample Output

19
33

HINT

(优先队列 +或者+哈夫曼)

#include<stdio.h>
#include<queue>
using namespace std;
struct node
{
   int a;
   friend bool operator<(node aa,node bb)
   {
       return aa.a>bb.a;
   }
};
int main()
{
    int n,t,a,sum;
    node bb,aa;
    scanf("%d",&t);
    while(t--)
    {
        priority_queue<node>q;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            bb.a=a;
            q.push(bb);
        }
        sum=0;
        while(!q.empty())
        {
            aa=q.top(); q.pop();//printf("%d ",aa.a);
            if(n==1)  break;
            bb=q.top(); q.pop();
            n--;
            aa.a+=bb.a;
            sum+=aa.a;
            q.push(aa);
        }
        printf("%d\n",sum);
    }
}

/**************************************************************
    Problem: 1588
    User: aking2015
    Language: C++
    Result: Accepted
    Time:92 ms
    Memory:1064 kb
****************************************************************/
时间: 2024-08-03 15:28:46

合并果子(优先队列 +或者+哈夫曼)的相关文章

使用优先队列构建赫夫曼树

关于赫夫曼编码和赫夫曼树的相关知识可参考之前两篇文章(由二叉树构造赫夫曼树.赫夫曼编码).本文介绍另一种构建赫夫曼树的方式,采用优先队列. 步骤: 1.首先我们需要统计不同字符出现的次数.一个字符出现的次数越多,说明其优先级越高,其赫夫曼编码应该越短: 2.将待编码的字符(即带权节点)存入优先级队列,优先级即字符出现的次数: 3.不断迭代队列,直到队列中剩下一个元素(即根节点).每次从队列中取出两个优先级最小的元素(优先级队列中的元素是按照节点优先级顺序排列的),然后生成一个新的赫夫曼树节点,节

POJ 3253 Fence Repair(优先队列,哈夫曼树)

题目 //做哈夫曼树时,可以用优先队列(误?) //这道题教我们优先队列的一个用法:取前n个数(最大的或者最小的) //哈夫曼树 //64位 //超时->优先队列,,,, //这道题的优先队列用于取前2个小的元素 #include <iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; _

最小优先队列实现赫夫曼树 贪心策略

使用 最小优先队列存放要编码的key,和合并之后内部节点,注意最小优先队列,获得最小值时会把最小是删掉,下面是java实现. package Algorithms; class MinQueue<T extends Comparable<? super T>>{ int heapSize; T[] heap; int capacity; public MinQueue(int capaticty) { this.capacity=capaticty; heapSize=0; //因

优先队列和哈夫曼树

https://www.acwing.com/problem/content/description/150/ 哈夫曼树可以通过小根堆实现.小根堆每次弹出两个值,然后将二者的和再插入小根堆中. 比如求 #include<stdio.h> #include<queue> using namespace std; int n,ans,k; priority_queue<int,vector<int>,greater<int> > q;//小根堆 in

codevs 1063 合并果子 优先队列

刚开始没看清题意,以为要按照顺序合并,结果码了DP:后来明白题意后,才知道这道题并不难,运用优先队列水过. 讲一下优先队列: 普通的队列的元素遵循先进先出,后进后出的原则,但在优先队列里,每个元素被赋予优先级,优先级较高的最先出列.定义优先队列时默认为大根堆,即元素越大优先级越高,越先出列. 看了别人的博客才知道:优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间. 优先队列用之前需声明: #include<queue> using namespace std; pr

poj 3253 贪心+优先队列【哈夫曼思想】

题目链接 题目大意: 大意:需要把一根长木棍锯成一些短木棍短木棍的长度是告诉你的每一次锯的花费为要锯的改段的长度问最小花费比如n个小木棍长度分别5 8 8也就是相当于你有一根21的木棍 现在需要把它锯成 上述的三段每次只能把一个木棍锯成两段比如21可以锯成13 和 8 但是由于选择的是21 所以花费为21第二次把13 锯成5和8 花费 为13总花费为21 + 13 = 34 分析:其实我们可以逆向思维想在有n跟木棍现在想要把他们拼成一跟每一次的花费就是这两段的和那么我们根据贪心的思想肯定是每次选

HDU 1053 Entropy(哈夫曼编码 贪心+优先队列)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1053 Entropy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7233    Accepted Submission(s): 3047 Problem Description An entropy encoder is a data

poj3253哈夫曼树

Fence Repair Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Farmer John wants to repair a small length of the fence around the pasture. He measures the

哈夫曼编码课程设计+最小优先对列建树。

问题描述 利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原).对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统.试为这样的信息收发站编写一个赫夫曼码的编/译码系统. 基本要求 一个完整的系统应具有以下功能: (1) I:初始化(Initialization).从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中. (