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 ;
}

最新文章

  1. fedora22命令useradd,groupadd等命令不能自动补全
  2. C#基础总结之二循环控制-运算符
  3. iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
  4. 事务回滚后,自增ID仍然增加
  5. windowsphone 瀑布流&amp;ui虚拟化
  6. 在ASP.NET MVC中的四大筛选器(Filter)及验证实现
  7. SQL SERVER 函数大全[转]
  8. (转)php中GD库的配置,解决dedecms安装中GD不支持问题
  9. FragmentPagerAdapter与FragmentStatePagerAdapter差异
  10. Python进阶之路---1.3python环境搭建
  11. accept系统调用内核实现
  12. 对C# 中Readonly的再认识
  13. PoolManager 简单使用
  14. SVG的a链接
  15. python 归并排序
  16. docker for ubuntu 18 安装
  17. 设置了winform的背景图片随窗体的变化而变化
  18. Mirror--如何在主库上增加文件
  19. ssh的配置,ssh打开密钥登陆,关闭密码登陆。
  20. 关于 BigDecimal 的小数位的入舍去操作

热门文章

  1. windows7下c++11环境搭建
  2. HDOJ1238(string)
  3. Python:itertools库的使用
  4. 解析CmdLine参数
  5. JavaScript原型模式(prototype)
  6. [51nod1058]求N!的长度
  7. Animations使用01 BrowserAnimationsModule
  8. grep的常用命令语法
  9. 蚂蚁金服HR电话面
  10. Java面向对象的三大特性 多态