HDU 5884

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

题目大意:给你n个序列,将其合并为一个,每次合并序列的花费为所合并子序列长度的和,先给你总花费t,问每次最少合并多少个子序列。

思路:很容易想到二分+贪心的办法,需要特别注意:假如枚举的 k,那么每次合并消耗的是 k−1个,最后合并完后剩下一个,所以总消耗是 n−1 个,如果 (n−1)%(k-1)!=0,会存在零头,也就是说凑不够 k 个,零头肯定不能放在最后合并,应该将这个零头放在开头合并,取这零头+1个数进行合并,也就是取这最小的几个进行合并,或者用权值为0的虚点凑齐零头,这个结论在纸上举例比划一下就明白了,本质是一个多叉哈夫曼树。另外这里可以用两个普通队列代替优先队列进行模拟,一个队列存原数组,另外一个存合并后的数,可以知道这两个都是可以保证有序,取的时候比较取最小值就行,可以将复杂度从n*logn*logn优化到n*logn。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值