hdu5884

题意

给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少。

分析

二分 k,合并数的时候可以按照哈夫曼树构树的原理来进行合并。因为新形成的数存在递增的单调性,所以可以开一个数组(队列)存储新生成的数,将原来的数组排序,通过取两个数组最小的 k 个数,将和放置到队尾,直到只剩下一个数。

如果 \((n-1)\%(k-1)\neq0\),说明不能正好合并得到一个数,此时要先选择\((n-1)\%(k-1)+1\)个数进行合并。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 200005;
int a[MAXN], b[MAXN];
int n, s;
ll disp(int k) {
int h1 = 0, h2 = 0, t2 = 0;
int cnt = n;
b[t2] = 0;
ll res = 0;
for(h1 = 0; h1 < (n - 1) % (k - 1) + 1; h1++) {
b[t2] += a[h1];
cnt--;
res += a[h1];
}
if(b[t2] > 0) { t2++; cnt++; }
while(cnt != 1) {
int c = 0;
b[t2] = 0;
while(c < k) {
if(h1 < n && (h2 == t2 || a[h1] < b[h2])) {
b[t2] += a[h1];
res += a[h1];
h1++;
cnt--;
} else {
b[t2] += b[h2];
res += b[h2];
h2++;
cnt--;
}
c++;
}
t2++;
cnt++;
}
return res;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T;
for(cin >> T; T--;) {
cin >> n >> s;
ll ans = 0;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int l = 2, r = n, mid;
while(l < r) {
mid = (l + r) / 2;
if(disp(mid) <= s) r = mid;
else l = mid + 1;
}
cout << l << endl;
}
return 0;
}

hdu5884(多叉哈夫曼树)的更多相关文章

  1. hdu5884 Sort(二分+k叉哈夫曼树)

    题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...

  2. Sort HDU5884(二分+多叉哈夫曼树)

    HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k. 思路:还是太单纯,看完题目一直 ...

  3. 两个队列+k叉哈夫曼树 HDU 5884

    // 两个队列+k叉哈夫曼树 HDU 5884 // camp题解: // 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, ...

  4. 【CF884D】Boxes And Balls k叉哈夫曼树

    题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少. 引理:K 叉哈夫曼树需要保证 \((n-1) ...

  5. UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树

    [NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...

  6. AcWing:149. 荷马史诗(哈夫曼编码 + k叉哈夫曼树)

    追逐影子的人,自己就是影子. ——荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和<伊 ...

  7. HDU 5884 Sort (二分+k叉哈夫曼树)

    题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...

  8. hdu 5884 Sort 队列+多叉哈夫曼树

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  9. bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...

随机推荐

  1. Caliburn micro 学习笔记...

    页面跳转 LLS 结合 CM 使用方法 事件处理

  2. MySQL增强半同步几个重要参数搭配的测试

      Preface       Semi-synchronous replication is supported since MySQL 5.5 and then enhanced graduall ...

  3. 1、shader简介、渲染管线

    vs对于shader的插件:http://blog.shuiguzi.com/shaderlabvs-release-page.html 计算机有一块重要的组成部分,就是“显卡”,大家玩游戏的话,肯定 ...

  4. 孤荷凌寒自学python第三天 初识序列

    孤荷凌寒自学python第三天 初识序列 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的序列非常让我着迷,之前学习的其它编程语言中没有非常特别关注过序列这种类型的对象,而pyt ...

  5. 附录:python and numpy

    http://cs231n.github.io/python-numpy-tutorial/ Python is a great general-purpose programming languag ...

  6. 一步步精通NodeJs的简单实例

    一步一步完成nodejs+express+mysql的简单实例开发 1.使用express创建简单web服务器 项目文件下安装express,这个不多说,很简单,直接在项目目录下运行 npm inst ...

  7. Servlet 返回Json数据格式

    其实就是把数据库中的数据查询出来拼接成一个Json数据 import dao.UserDao; import endy.User; import javax.servlet.ServletExcept ...

  8. HTML5的JavaScript选择器介绍

    在HTML5出现之前使用JavaScript查找DOM元素,有以下三种原生的方法: getElementById:根据指定元素的id属性返回元素 getElementsByName:返回所有指定nam ...

  9. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用?

    $this:当前对象 self: 当前类 parent: 当前类的父类 $this在当前类中使用,使用->调用属性和方法. self也在当前类中使用,不过需要使用::调用. 静态属性,不能在类里 ...

  10. KVC 开发详情

    目录 概述 KVC基本技术 KVC访问函数 KVC搜索顺序 KVC集合操作 一.概述 kvc全名是Key-value coding,kvc是一种通过字符串间接的访问oc对象的属性的一种技术. 一个oc ...