UVA 10954 Add All 哈夫曼编码
题目链接:
题目
Add All
Time Limit:3000MS
Memory Limit:0KB
问题描述
Yup!! The problem name reflects your task; just add a set of numbers. But you may feel yourselves
condescended, to write a C/C++ program just to add a set of numbers. Such a problem will simply
question your erudition. So, lets add some flavor of ingenuity to it.
Addition operation requires cost now, and the cost is the summation of those two to be added. So,
to add 1 and 10, you need a cost of 11. If you want to add 1, 2 and 3. There are several ways
1 + 2 = 3, cost = 3 1 + 3 = 4, cost = 4 2 + 3 = 5, cost = 5
3 + 3 = 6, cost = 6 2 + 4 = 6, cost = 6 1 + 5 = 6, cost = 6
Total = 9 Total = 10 Total = 11
I hope you have understood already your mission, to add a set of integers so that the cost is minimal.
输入
Each test case will start with a positive number, N (2 ≤ N ≤ 5000) followed by N positive integers
(all are less than 100000). Input is terminated by a case where the value of N is zero. This case should
not be processed.
输出
For each case print the minimum total cost of addition in a single line.
样例
input
3
1 2 3
4
1 2 3 4
0
output
9
19
题意
给你n个数,每次合并两个数,贡献值为这两个数的和,问如何使总的贡献值最小。
题解
越早加的数,被加的次数会越多(早加的数虽然合并了,但它的贡献还在,只是和其他数绑定在一起了)。那么我们当然是贪心让越小的数越早加了。
如果你把一个数被加的次数看成高度的话,那这道题就是赤裸裸的哈夫曼树,严格的贪心证明可以参考第一本白皮书,或者网上搜一下应该有。
代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<functional>
using namespace std;
typedef long long LL;
int n;
int main(){
	while(scanf("%d",&n)==1&&n){
		LL ans=0;
		priority_queue<int,vector<int>,greater<int> > pq;
		for(int i=0;i<n;i++){
			int x; scanf("%d",&x);
			pq.push(x);
		}
		for(int i=0;i<n-1;i++){
			int x=pq.top(); pq.pop();
			int y=pq.top(); pq.pop();
			ans+=x+y;
			pq.push(x+y);
		}
		printf("%lld\n",ans);
	}
	return 0;
}												
											UVA 10954 Add All 哈夫曼编码的更多相关文章
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
		
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
 - java实现哈夫曼编码
		
java实现哈夫曼编码 哈夫曼树 既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...
 - Java实现哈夫曼编码和解码
		
最近无意中想到关于api返回值加密的问题,譬如我们的api需要返回一些比较敏感或者重要不想让截获者得到的信息,像如果是做原创图文的,文章明文返回的话则有可能被抓包者窃取. 关于请求时加密的方式比较多, ...
 - 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
		
前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...
 - 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码
		
20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...
 - java使用优先级队列实现哈夫曼编码
		
思路: 构建小根堆 根据小根堆实现哈夫曼树 根据哈夫曼树对数据进行编码 代码实现如下: /** * @Author: DaleyZou * @Description: 使用java实现一个哈夫曼编码的 ...
 - 奇妙的算法【4】-汉诺塔&哈夫曼编码
		
1,汉诺塔问题[还是看了源码才记起来的,记忆逐渐清晰] 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着6 ...
 - Java数据结构(十二)—— 霍夫曼树及霍夫曼编码
		
霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...
 - Java 树结构实际应用 二(哈夫曼树和哈夫曼编码)
		
赫夫曼树 1 基本介绍 1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), ...
 
随机推荐
- Asp.net绑定带层次下拉框(select控件)
			
1.效果图 2.数据库中表数据结构 3.前台页面 <select id="pid" runat="server" style="width:16 ...
 - 关于windows的svchost进程的问题(年代有点久远)
			
这是N年前写的一篇关于svchost的blog,虽然写的不好却是我第一次写的技术类blog, 发上来做开博第一篇吧. ***************************************** ...
 - Ajax Array Json 示例
			
function functionName(){ var list=new Array(); $("td.classA").each(function(){ list.push($ ...
 - 《iOS开发指南》要改iOS8版本了,听听您的意见?
			
<iOS开发指南>要改iOS8版本了,听听您的意见?参加问卷同学均可获得智捷课堂50元代金卡一张,同时抽取一名同学赠送即将出版的基于iOS8的<iOS开发指南>一本,欢迎大家填 ...
 - 使用pch预编译文件
			
首先新建一个pch文件,然后要修改这个项目的Build Setting中的Prefix Header 修改为 $(SRCROOT)/项目名称/预编译文件名: 一般pch文件的用处: 1.导入框架, ...
 - 20141109--SQL  练习题-1
			
create database xinxiku go use xinxiku go create table Student ( Sno ) primary key, Sname ) not null ...
 - 6个超炫酷的HTML5电子书翻页动画
			
相信大家一定遇到过一些电子书网站,我们可以通过像看书一样翻页来浏览电子书的内容.今天我们要分享的HTML5应用跟电子书翻页有关,我们精选出来的6个电子书翻页动画都非常炫酷,而且都提供源码下载,有需要的 ...
 - Sublime Text 2入门指南
			
Sublime Text 2入门指南 一天在iteye上看到范凯介绍一个开发工具(TextMate ),看下面的评论时看到Sublime Text 2.其实我一直喜欢editplus.百度了一番才 ...
 - 《boot分区监控的小脚本》
			
#!/bin/bash TEST=`df | grep "boot" |awk '{print $5}' |cut -f1 -d"%"` if [ $TEST ...
 - ubuntu 14.04 apt-get 方式安装oracle JDK
			
之前已经写了 如何手动安装oracle 的JDK :http://www.cnblogs.com/bcsflilong/p/4196536.html 其实 还有可以简单方便的用apt-get 的方式安 ...