UESTC 2017 Summer Training #22-G.Dreamoon and NightMarket

题意:

给你一个长度为n的数组 (n<=2x10^5)我们认为每一个数都是独立的 每次可以从数组中选出一些数(不能不选)(已经选过的组合要求不能再选)男主每次都会选当前能选的组合中sum值最小的组合 现在给出一个k (k合法且<=1e6)表示男主的第k次选择 输出 这次选出组合的sum值(数组中的数>=0)

题解: 

对于初始数组 我们先排个序(从小到大)
我们最初的想法是 优先队列 维护目前的最小sum值和组成此sum的最右坐标 先把数组中单个的数字入队 之后对于目前的最小sum值 我们push进去接下来可能的最小值
从此sum的最右坐标 到n扫一遍 更新sum与sum最右坐标 同时push 但是这样显然会超时
每次pop 对应o(n)个操作 我们要pop k次 所以 复杂度n*k 超时
 超时的地方在于push的次数太多 我们要换一种维护方式 要求1. push次数少2.每种组合最多入队一次(即不重复)3.下一次的可能最小值一定会在队列中(不漏)
这里有一种方式可以做到上述三点
先把排序后的第一个节点(sum与其最右坐标)push 入队 。维护时对于(sum,i)
我们为了保证以后的不漏 (组合可能有i也可能没i)所以要把有i的下一个可能最小组合和没i的下一个可能最小组合push入队 分别是(sum+a[i+1],i+1)(sum-a[i]+a[i+1],i+1)
所以复杂度0(2*k)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值