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

题目大意:有n个有序的序列,对于第i个序列有ai个元素。 现在有一个程序每次能够归并k个序列, 他的花费为k个序列中的总的元素数。现在想知道在花费不超过t的情况下存在的最小的k为多少?

解题思路:二分k的值,合并k个序列的值, 加入队列,然后用哈夫曼检查最小花费是否超过t! 这时需要注意最后一次合并是否为k个数, 如果不是k个数,就不是最优的哈夫曼的值, 如果最后是k个数, 那么最后n, k一定符合(n-1)%(k-1) == 0, 只需在二分出k的值时判断一下, 如果不是0的话, 可以对前面进行补0操作, 这样得的值是最优的(可以自行搜索k叉哈夫曼树)。

关于怎么快速计算哈夫曼的值,可以用两个队列维护两个有序的序列, 可以在O(n)的时间内得出哈夫曼的值(注:优先队列不可以, n*log(n)这题会超时)

代码如下:

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ; int a[N], n, t;
bool judge(int mid)
{
int cnt;
if((n-) % (mid - ) == )
cnt = ;
else
cnt = ((n - ) / (mid - ) + ) * (mid - ) + - n;
queue<ll> que1, que2;
for(int i=; i<n; ++ i)
que1.push(a[i]);
ll ans = ;
ll res = ;
while((que1.size() == && que2.empty() && res == ) == false)
{
if(!que1.empty() && !que2.empty())
{
if(que1.front() > que2.front())
{
res += que2.front();
que2.pop();
}
else
{
res += que1.front();
que1.pop();
}
}
else if(!que1.empty() && que2.empty())
{
res += que1.front();
que1.pop();
}
else if(que1.empty() && !que2.empty())
{
res += que2.front();
que2.pop();
}
cnt ++; if(cnt == mid)
{
ans += res;
if(que1.size())
{
if(que1.back() <= res)
que1.push(res);
else
que2.push(res);
}
else
que1.push(res);
res = , cnt = ;
}
}
if(ans <= t)
return true;
else
return false;
} void solve()
{
scanf("%d%d", &n, &t);
for(int i=; i<n; ++ i)
scanf("%d", &a[i]);
sort(a, a+n);
int l = , r = n;
while(l < r)
{
int mid = (l + r) >> ;
if(judge(mid))
r = mid;
else
l = mid + ;
}
printf("%d\n", l);
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
solve();
}
return ;
}

Hdu OJ 5884-Sort (2016 ACM/ICPC Asia Regional Qingdao Online)(二分+优化哈夫曼)的更多相关文章

  1. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. 2016 ACM/ICPC Asia Regional Qingdao Online(2016ACM青岛网络赛部分题解)

    2016 ACM/ICPC Asia Regional Qingdao Online(部分题解) 5878---I Count Two Three http://acm.hdu.edu.cn/show ...

  3. 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分

    I Count Two Three Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 【2016 ACM/ICPC Asia Regional Qingdao Online】

    [ HDU 5878 ] I Count Two Three 考虑极端,1e9就是2的30次方,3的17次方,5的12次方,7的10次方. 而且,不超过1e9的乘积不过5000多个,于是预处理出来,然 ...

  5. hdu 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 题目大意: 给出一个数n ,求一个数X, X>=n. X 满足一个条件 X= 2^a*3^ ...

  6. 2016 ACM/ICPC Asia Regional Qingdao Online HDU5889

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5889 解法:http://blog.csdn.net/u013532224/article/details ...

  7. 2016 ACM/ICPC Asia Regional Qingdao Online HDU5883

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 解法:先判断是不是欧拉路,然后枚举 #pragma comment(linker, "/S ...

  8. 2016 ACM/ICPC Asia Regional Qingdao Online HDU5882

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5882 解法:一个点必须出度和入度相同就满足题意,所以加上本身就是判断奇偶性 #include<std ...

  9. 2016 ACM/ICPC Asia Regional Qingdao Online HDU5879

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5879 解法:我们知道到某个极限之后结果相同,所以找到那个极限,其他保存之后输出就好了 #include&l ...

随机推荐

  1. UML,Powerdesigner 使用方法

    http://blog.163.com/guomaolin_gavin/blog/static/199618307201272674936220/

  2. iTextSharp 使用详解(转)

    PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段“暴力”破解的方法,代码片断如下 ...

  3. C# 多线程的等待所有线程结束 用 ManualResetEvent 控制

    using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication ...

  4. JSONP理解和使用

    一.代码使用: $.ajax({ async:false, url: http://跨域的dns, type: "GET", dataType: 'jsonp'}); 二.理解: ...

  5. 51nod 1515 明辨是非 并查集 + set + 启发式合并

    给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...

  6. 移动端line-height失效

    移动端高度过小,使用rem布局时div里面的文字不能用line-height垂直居中: 解决方案,先高度,字体大小扩大n倍,然后利用transform:scale(0.n)缩小即可.

  7. GDI+系列

    1.GDI+的概述 2.绘图表面 3.GDI+坐标系 4.用Pen对象画图 1.使用GDI+画线 2.使用GDI+画弧线 3.使用GDI+画曲线 4.使用GDI+画椭圆 5.使用GDI+画矩形.多边形 ...

  8. chrome设置可以跨域访问

    右键chrome的快捷方式->属性 修改目标属性:添加--args --disable-web-security  --user-data-dir=F:\MyChromeDevUserData, ...

  9. Embed dll Files Within an exe (C# WinForms)—Winform 集成零散dll进exe的方法

    A while back I was working on a small C# WinForms application in Visual Studio 2008. For the sake of ...

  10. 去块率波 Deblocking filter

    基于块的视频编码的一个典型特点就是在图像中会出现偶发的可察觉的块结构,这是由于重构块的边缘像素与块内部像素相比恢复精度要低,块效应是目前压缩编码最明显的视觉失真之一.在H.264/ AVC视频编码标准 ...