uva 10954 Add All(哈弗曼编码)

这道题我一开始想错了,这么简单的题都wa了两发。。。我往贪心上面想了,每次都找一个最小的数相加,结果就是

排序后直接往后加,还在那纳闷为何出错。。。其实这道题是哈弗曼编码问题,简直是模板题目,就是每次找两个最

小的结点求和后把他们的和放到节点中去,把这两个点删除。。。用的multiset,其实和set容器差不多,就是可

以存放重复的元素。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
using namespace std;
int main()
{

	int i,n,a;
	multiset<int>ms;
	while(cin >> n,n)
	{
		for(i=1; i<=n; i++)
		{
			cin >> a;
			ms.insert(a);
		}
		set<int>::iterator it;
	//	for(it=ms.begin(); it!=ms.end(); it++)
	//			cout << *it << " ";
	//	cout << endl;
		int ans = 0;

		int sum;
		while(ms.size()!=1)
		{
			sum = 0;
			it = ms.begin();
			sum += *it;
			ms.erase(it);
			it = ms.begin();
			sum += *it;
			ms.erase(it);
			ms.insert(sum);
			ans += sum;
		}
		ms.clear();
		cout << ans << endl;
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 09:28:28

uva 10954 Add All(哈弗曼编码)的相关文章

java实现哈弗曼编码

根据输入的各个叶节点的权值,构建一棵最优树,根据最小带全路径,确定由0,1组成的哈弗曼编码. 首先在一个封装类TNode中构建一棵树的元素,比如权值,左节点,右节点,同时在TNode类中构建了哈弗曼编码值,以及判断节点是否为叶子节点 package 霍夫曼编码; /** * * @author luckid * @version 2014_10_11 * */ /** * 定义Huffman编码的节点 */ public class TNode { /** * * @param weight *

用哈弗曼编码实现文件压缩和解压

放假了把这个改一下,发现确实用单字节压缩的压缩率要高一些,暂时没去管为什么,不过放假静下心来写的话确实效率高很多. 新版详见:http://blog.csdn.net/tookkke/article/details/50575103 今天脑洞大开突然想写一下,明明都要考试了,唉,怎么就管不住这手啊  总之呢,就是根据每种编码的出现频率把等长的编码换成变长的,据说理论上压缩比率是比较高的,可是为什么经检验我这个大部分时候压缩出来的比源文件还大呢? 哈弗曼编码的时候要先做一颗字典树,查找的时候就按照

哈弗曼编码和译码.cpp

<span style="color:#6600cc;">#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ char a;//记录对应字符 int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char * *HuffmanCode;//动态分配数组存储哈夫

数据结构实验2(设计哈弗曼编码和译码系统)

设计一个哈弗曼编码和译码系统, 要求如下: B--建树:读入字符集和各字符频度,建立哈夫曼树. T--遍历:先序和中序遍历二叉树. E--生成编码:根据已建成的哈夫曼树,产生各个字符的哈夫曼编码. C--编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和codefile.txt中. D--译码:读入codefile.txt,利用已建成的哈夫曼树进行译码,并将译码结果存入磁盘文件resul

利用哈弗曼编码进行压缩

// sZipDemo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "HuffmanTree.cpp" #include "sZip.h" #include <fstream> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char str1[100

哈弗曼编码译码系统

/**********************************************************************                                        * 学校:黄淮学院                                                         * 院系:信息工程学院                                                     * 年级专业:网络

哈弗曼编码解码

#lang scheme ( define nil '() ) ( define ( make-leaf symbol weight ) ( list 'leaf symbol weight ) ) ( define ( leaf? obj ) ( eq? ( car obj ) 'leaf ) ) ( define ( symbol-leaf x ) ( cadr x ) ) ( define ( weight-leaf x ) ( caddr x ) ) ( define ( make-co

uva 10954 Add All(排序)

uva 10954 Add All 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, let's add

【算法设计与分析】8、哈弗曼编码,贪心算法实现

写这个玩意,我也是深深地感觉到自己数据结构的薄弱,可笑的是我一直以为学的还可以,结果一个堆结构就干了我半个月,才懂个大概= =,我也是醉了 BinaryTree.h二叉树的实现 /** * 书本:<算法分析与设计> * 功能:这个头文件是为了实现二叉树 * 文件:BinaryTree.h * 时间:2014年12月15日18:35:51 * 作者:cutter_point */ // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |