题目

思路

很容易想到第一种做法,用Huffman算法,从森林中找出两个值最小的节点,合并再加入森林,在这个过程中不断记录。

但是每一次需要sort一遍,将最小的两个值节点置于头两个节点,最坏情况下复杂度是O(n^3)的量级,结果是TLE。

第二种方法是利用STL中的priority_queue模板进行解题,很方便,这里给出AC代码。但是优先队列手写实现还是需要实践,将在下一篇进行实现。

代码

Huffman:

//
//  main.cpp
//  Huffman Tree2
//
//  Created by wasdns on 16/12/24.
//  Copyright © 2016年 wasdns. All rights reserved.
//#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;struct Node
{int num;Node *l, *r;
};bool cmp(Node *n1, Node *n2)
{if (n1 -> num != n2 -> num) return n1 -> num < n2 -> num;return false;
}Node *node[100005];/*Ininode:初始化节点*/
void Ininode(int n)
{int i;for (i = 1; i <= n; i++){node[i] = new Node;cin >> node[i] -> num;node[i] -> l = NULL;node[i] -> r = NULL;}
}/*Huffman函数*/
int Huffman(int n)
{int cnt = 0;sort(node+1, node+n+1, cmp);while (1){if (node[2] -> num == 100005)                        //只剩下一棵树{break;}cnt += node[1] -> num;cnt += node[2] -> num;node[1] -> num = node[1] -> num + node[2] -> num;    //1、2合并为1node[2] -> num = 100005;                             //删除2sort(node+1, node+n+1, cmp);                         //将值最小的两棵树前移}return cnt;
}int main()
{int n;cin >> n;Ininode(n);int ans = Huffman(n);cout << ans << endl;return 0;
}

STL_Priority_Queue:

//
//  main.cpp
//  PriorityQueue STL
//
//  Created by wasdns on 16/12/24.
//  Copyright © 2016年 wasdns. All rights reserved.
//#include <iostream>
#include <functional>
#include <queue>
using namespace std;struct cmp
{bool operator() (int x,int y) {return x > y;}
};int storage[100005];int main()
{int n;cin >> n;//priority_queue<int, vector<int>, greater<int>> q;priority_queue<int, vector<int>, cmp> q;for (int i = 1; i <= n; i++){cin >> storage[i];q.push(storage[i]);}int cnt = 0;while (q.size() > 1){int x = q.top();q.pop();int y = q.top();q.pop();cnt += x+y;q.push(x+y);}cout << cnt << endl;return 0;
}

2016/12/24

DS实验题 融合软泥怪-1相关推荐

  1. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  2. DS实验题 Inversion

    题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...

  3. DS实验题 击鼓传花

    题目: 代码1(数组实现): // // main.cpp // DS-击鼓传花 // // Created by wasdns on 16/11/9. // Copyright © 2016年 wa ...

  4. DS实验题 Floyd最短路径 Prim最小生成树

    题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19 ...

  5. 小孩的游戏 - 2021数据结构 排序和选择实验题

    小孩的游戏 - 2021数据结构 排序和选择实验题 pre 做都做了, 干脆发上来算了 : D 题目分析 算法与数据结构实验题 5.18 小孩的游戏 ★实验任务 一群小孩子在玩游戏,游戏规则是这样子, ...

  6. 数值分析上机题matlab线性方程组,数值分析上机实验报告 - 线性方程组部分实验题1...

    s=A(i,(i+1):n)*x((i+1):n,1); else s=0; end x(i,1)=(b(i)-s)/A(i,i);end %Cholosky分解方法***************** ...

  7. SSLGET ×××综合实验题

    SSL&GET ×××综合实验题 1.网络拓扑 2.网络需求 KS与Inside1.Inside2.DMZ2建立GET ×××,ASA对外提供SSL ×××. 3.具体配置 KS: ip do ...

  8. 2021年春季学期-信号与系统-第七次作业参考答案-MATLAB实验题

    本文是 2021年春季学期-信号与系统-第七次作业参考答案 的小题的参考答案. ▌MATLAB 实验题 ▌ 在网络学堂下载一段音乐及其经过处理后的音乐数据文件,聆听相应的音频效果.使用在MATLAB中 ...

  9. 2021年春季学期-信号与系统-第四次作业参考答案-MATLAB实验题2

    本文是 2021年春季学期-信号与系统-第四次作业参考答案 的内容. ▌MATLAB实验题2 2. 回声的模拟与消除 在山间,或者洞穴中说活,会听到回声,这是声音在相距较远的山壁之间来回反射传播产生的 ...

最新文章

  1. 获取AD里面指定OU或Container里面的计算机以及Lastlogon时间格式转换
  2. JS性能--DOM编程之重排与重绘
  3. C语言进行数据指定步长的区间统计
  4. 1.封装WinMain至动态链接库
  5. 如何展示富文本_自助建站如何做出个性化效果?
  6. 微软宣布新命令行工具 Windows Terminal 和 WSL2
  7. 够狠 | 单点登录三种方式,够狠!够劲爆!
  8. 内核同步机制-信号量(semaphore)
  9. osx10.15.5降级成10.3.3
  10. 移动端页面兼容性问题解决方案整理(一)
  11. php yii composer,yii2怎么用composer生成一个应用?
  12. mysql授权与回收_MySQL 授权,回收权限,查看权限
  13. Linux群常见问题整理(一)[转]
  14. L2与L1正则化理解
  15. 斐讯K2刷华硕固件教程
  16. java的io流有什么作用_Java IO流详解(一)——简单介绍
  17. 安卓小游戏:小板弹球
  18. 分布式计算原理之分布式协调与同步(1)——分布式互斥
  19. 开房信息被黑客“脱裤”以后…
  20. 如何申请ATT官方解锁iPhone4

热门文章

  1. JSON转化工具的使用
  2. 计算机入门初中教学视频,【初中计算机教学方法初探】初中信息技术计算机组成教学视频...
  3. 235. Lowest Common Ancestor of a Binary Search Tree(Tree-Easy)
  4. 如何拥有强悍的学习能力?
  5. 喵喵机VS咕咕机VS印先生App对比
  6. 福州高新区第二届职工羽毛球赛火热开启
  7. uniapp真机运行app失败IOS端
  8. C++总结笔记(三)—— 结构体
  9. 使用阈值调优改进分类模型性能
  10. iphone内存检查工具leak