题目

思路

很容易想到第一种做法,用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合并为1
node[2] -> num = 100005; //删除2 sort(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实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  3. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  4. DS实验题 sights

    算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...

  5. DS实验题 order

    算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...

  6. DS实验题 Order 已知父节点和中序遍历求前、后序

    题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...

  7. DS实验题 Inversion

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

  8. DS实验题 Missile

    题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...

  9. DS实验题 击鼓传花

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

随机推荐

  1. Qt应用程序图标设置

    Qt应用程序图标设置 本文仅仅适用于windows下,linux等不适用. 下面说的图标,指的是程序文件的图标,而不是托盘图标或者说运行时任务栏的图标(任务栏和程序窗口的图标在windows/linu ...

  2. Windows10+Ubuntu双系统安装 (转)

    1.Windows10+Ubuntu双系统安装:   http://www.jianshu.com/p/2eebd6ad284d 2.UEFI启动模式安装ubuntu指南  :  http://col ...

  3. ubuntu 创建用户

    http://www.jb51.net/article/45848.htm  创建用户

  4. .NET LINQ查询操作中的类型关系

    LINQ 查询操作中的类型关系      若要有效编写查询,您应该了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果您了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. 另外 ...

  5. RAD Studio 2009-10Seattle IDE Fix Pack 5.94

    IDE Fix Pack 5.94 IDE Fix Pack is a collection of unofficial bug fixes and performance optimizations ...

  6. SpringMVC拦截器

    springmvc的拦截器 需求:进行用户的访问控制,判断用户是否登陆,如果登陆进行正常访问,如果没有登陆跳转到登陆页面. 1自定义拦截器类 package org.guangsoft.utils; ...

  7. weiphp布署在sina sae图片显示不了问题

    sae 上傳因為新浪云是有權限的限制的,所以要有權限才能上傳,以圖片為例首先在入口文件目錄(applicaiton)里的common的conf 里的config配置把上传驱动设为sea 代码 如下:' ...

  8. MongoDB的导入导出(7)

    导入/导出可以操作的是本地的mongodb服务器,也可以是远程的. 所以,都有如下通用选项: -h host   主机 --port port    端口 -u username 用户名 -p pas ...

  9. jquery插件开发继承了jQuery高级编程思路

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  10. Designing IP-Based Video Conferencing Systems: Dealing with Lip Synchronization(唇音同步)

    转自:http://www.ciscopress.com/articles/article.asp?p=705533&seqNum=6 Correlating Timebases Using ...