Sort HDU - 5884 哈夫曼权值O(n)
2024-08-31 21:48:54
http://acm.hdu.edu.cn/showproblem.php?pid=5884
原来求一次哈夫曼可以有O(n)的做法。
具体是,用两个队列,一个保存原数组,一个保存k个节点合并的数值,然后每次选k个的时候,用two point在两个队列中选k个出来即可。
然后又把新的节点放去第二个队列那里去。
所以,首先需要排序(这样就和求 一次huffman编码的时间复杂度一样了nlogn)
然后这样明显第二个队列是单调递增的。
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = + ;
int a[maxn];
int n, T;
LL que[][maxn], head[], tail[];
LL en = 1e14;
bool check(int val) {
head[] = tail[] = head[] = tail[] = ;
int res = n % (val - );
if (res == ) {
res = val - ;
}
LL ans = ;
if (res == ) {
for (int i = ; i <= n; ++i) que[][tail[]++] = a[i];
} else {
int sum = ;
for (int i = ; i <= res; ++i) sum += a[i];
for (int i = res + ; i <= n; ++i) que[][tail[]++] = a[i];
ans = sum;
que[][tail[]++] = sum;
}
while (true) {
if (ans > T) return false;
LL sum = ;
int want = val;
while (want--) {
LL mi1 = 1e14, mi2 = 1e14;
if (head[] < tail[]) mi1 = que[][head[]];
if (head[] < tail[]) mi2 = que[][head[]];
if (mi1 < mi2) sum += mi1, head[]++;
else sum += mi2, head[]++;
if (mi1 == en && mi2 == en) return true; // 不可以取了
}
que[][tail[]++] = sum;
ans += sum;
}
return true;
}
void work() {
scanf("%d%d", &n, &T);
for (int i = ; i <= n; ++i) scanf("%d", a + i);
sort(a + , a + + n);
int be = , en = n;
// cout << check(2) << endl;
while (be <= en) {
int mid = (be + en) >> ;
if (check(mid)) en = mid - ;
else be = mid + ;
}
printf("%d\n", be);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
最新文章
- fedora22命令useradd,groupadd等命令不能自动补全
- C#基础总结之二循环控制-运算符
- iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
- 事务回滚后,自增ID仍然增加
- windowsphone 瀑布流&;ui虚拟化
- 在ASP.NET MVC中的四大筛选器(Filter)及验证实现
- SQL SERVER 函数大全[转]
- (转)php中GD库的配置,解决dedecms安装中GD不支持问题
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
- Python进阶之路---1.3python环境搭建
- accept系统调用内核实现
- 对C# 中Readonly的再认识
- PoolManager 简单使用
- SVG的a链接
- python 归并排序
- docker for ubuntu 18 安装
- 设置了winform的背景图片随窗体的变化而变化
- Mirror--如何在主库上增加文件
- ssh的配置,ssh打开密钥登陆,关闭密码登陆。
- 关于 BigDecimal 的小数位的入舍去操作