Sort

Time Limit: 3000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884

Problem Description

Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receives a task from Alice.
Alice will give Bob N sorted sequences, and the i-th sequence includes ai elements. Bob need to merge all of these sequences. He can write a program, which can merge no more than k sequences in one time. The cost of a merging operation is the sum of the length of these sequences. Unfortunately, Alice allows this program to use no more than T cost. So Bob wants to know the smallest k to make the program complete in time.

Input

The first line of input contains an integer t0, the number of test cases. t0 test cases follow.
For each test case, the first line consists two integers N (2≤N≤100000) and T (∑Ni=1 ai < T < 231).
In the next line there are N integers a1,a2,a3,…,aN(∀i,0≤ai≤1000).

Output

For each test cases, output the smallest k.

Sample Input

1
5 25
1 2 3 4 5

Sample Output

3


解题心得:

  1. 可以看出是一个k叉的哈夫曼树,确定k值的时候只能使用二分法。
  2. 要写k叉的哈夫曼树要克服几个条件,首先给出的数目不符合一个哈夫曼树的时候要填充0来凑数,然后一般写哈夫曼树都是使用优先队列,但是这个题卡掉了优先队列,可以根据合并的有序性来优化,使用两个队列,每次比较队顶元素的大小,取小的就行。
  3. 凑零的个数公式是:k - 1 - (n - 1)%(k - 1)。可以根据这个哈夫曼树的图来了解。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector <ll> ve;
queue <ll> qu,qu2;
bool checke(ll mid,ll m,ll n)
{while(!qu.empty())qu.pop();while(!qu2.empty())qu2.pop();ll ans = 0;/*如果当前的数目不可以直接得到一个哈夫曼数的时候可以添加权值为0的根节点来充凑*/if((n - 1)%(mid - 1) != 0){ll k = (n - 1)%(mid - 1);for(int i=0;i<mid-1-k;i++)qu.push(0);}for(int i=0;i<ve.size();i++)qu.push(ve[i]);/*可以根据合并的单调性用两个队列来优化时间,优化后的时间是O(nlogn);如果使用优先队列的复杂度会达到O(n(logn)^2);*/while(!qu.empty() || !qu2.empty()){ll sum = 0;for(int i=0;i<mid;i++){if(qu.empty() && qu2.empty())break;if(qu.empty()){sum += qu2.front();qu2.pop();}else if(qu2.empty()){sum += qu.front();qu.pop();}else{ll a = qu2.front();ll b = qu.front();if(a < b){sum += a;qu2.pop();}else{sum += b;qu.pop();}}}ans += sum;if(qu.empty() && qu2.empty())break;qu2.push(sum);}if(ans > m)return true;return false;
}void solve(ll n,ll m)
{ll r,mid,l;r = n,l = 0;while(l < r){mid = (l + r) / 2;if(checke(mid,m,n))l = mid+1;elser = mid;}printf("%lld\n",l);
}int main()
{int t;scanf("%d",&t);while(t--){ve.clear();ll n,m;scanf("%lld%lld",&n,&m);ll N = n;while(N--){ll temp;scanf("%lld",&temp);ve.push_back(temp);}sort(ve.begin(),ve.end());solve(n,m);}
}

转载于:https://www.cnblogs.com/GoldenFingers/p/9107251.html

哈夫曼树:HDU5884-Sort(队列、哈夫曼树)相关推荐

  1. 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

  2. 树的企业应用-哈夫曼编码树-有趣的数据压缩算法

    树的企业应用-哈夫曼编码树-有趣的数据压缩算法 哈夫曼编码 描述 张三去李四家里,但 李四是一个女生,所以张三找李四去上海迪尼斯玩 - 亚历山大.张三去伊丽莎白.李四家里,但 伊丽莎白.李四是一个女生 ...

  3. 哈夫曼树的生成及哈夫曼编码

    首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码. #include"stdio.h" #i ...

  4. java哈夫曼_用 JAVA 实现哈夫曼树(Huffman Tree)

    -1. 什么是树 树是一种 有层次关系的 数据结构.它由结点组成. 图一: 树的结点由 数据域 和 子结点域 组成.数据域 作为数据的容器:子结点域 存放 子结点 的地址.一个结点是它的子结点的父结点 ...

  5. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  6. 【数据结构】树(七)—— 哈夫曼树(C语言版)

    [数据结构]树(七)-- 哈夫曼树(C语言版) 前言 一.哈夫曼树的定义 二.哈夫曼树的构造过程描述 三.哈夫曼树的特点 四.哈夫曼树的应用--哈夫曼编码 1. 各类编码定义 2. 哈夫曼编码的构造 ...

  7. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

  8. 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

    哈夫曼编码的实现及应用论文 毕 业 设 计(论文) 题目 哈夫曼编码的实现 及应用 二级学院 数学与统计学院 专 业 信息与计算科学 班 级 学生姓名 张泽欣 学号 指导教师 职称 时 间 目录 摘要 ...

  9. 多媒体技术 || 自适应的霍夫曼编码与原始的霍夫曼编码的比较

    第一题: (a) 自适应的霍夫曼编码与原始的霍夫曼编码相比什么优点: 原始的Huffman算法给出了一种静态的编码树构造方案,要求在实际编码之前统计被编码对象中符号出现的几率,并据此进行编码树的构造. ...

  10. c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树

    1.树:n个结点的有限集,n=0时为空树. 1)特点: (1)有且仅有一个特定的称为根的结点. (2)有若干个互不相交的子树,这些子树本身也是一棵树. (3)树的根结点没有前驱结点,除根结点外的所有结 ...

最新文章

  1. import cycle not allowed_Cycle药物介绍醋酸群勃龙(2)
  2. ISCC2021 美人计
  3. php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...
  4. use 在php 用法中的总结
  5. Android群英传笔记——摘要,概述,新的出发点,温故而知新,能够为师矣!
  6. Java集合性能分析-疯狂Java讲义
  7. 刷新机制_云顶之弈:新版本推出新机制,可刷新指定羁绊,还可分解没用装备...
  8. python中getattr()的用法
  9. JavaScript执行机制-node事件循环
  10. rk3399_android7.1音频通路相关说明
  11. unity3d改变物体的中心位置_Unity3d粒子特效:制作火焰效果
  12. CS61A第一章笔记
  13. 基于Redis的推荐系统开发
  14. 软件开发中的瀑布模型
  15. 使用excelJs.js,导出excel,可以设置序列以及下拉框的联动
  16. Spring Batch单元测试示例
  17. VS中Qt 开发——无法解析的外部符号 QMetaObject 解决办法
  18. 浙大 | FcaNet:频域通道注意力机制(keras实现)
  19. 福到啦L1-6 福到了(15 分) “
  20. 数学里的 e 为什么叫做自然底数?

热门文章

  1. MySQL批量修改表的编码和字符集
  2. 建模师是个好职业吗?
  3. python实训报告万能模板_(完整word版)实训报告万能模板
  4. python常用进制转换
  5. [Spring Boot 6]企业级开发
  6. 自研代码率超70%,国产大数据基础软件第一股星环科技成功上市!
  7. java tpl文件_解决Layui tpl模板渲染文件上传不起作用
  8. DataBase_数据库的行式存储与列式存储
  9. 机器人路径规划_人工势场法
  10. 计算机考研数学复试时间,数学专业考研准备多久