算法题(94):除2!

审题:

本题需要我们对n个数据中的偶数数据进行不大于k次除2操作,使得n个数据的总和最小

思路:
方法一:贪心与优先级队列(大堆)

贪心策略:我们每次都对目前最大的偶数进行除2的操作

策略证明:由于我们的奇数不可以进行操作,所以不考虑,然后偶数中,越大的数据除2,所造成的数据值减少越大,所以每次都对目前最大的偶数除2就可以达到全局最小

解题:

(1)第一步:将奇数先直接加入sum中,偶数先放进数组中

sum用longlong是为了方式数据太大存不下

(2)第二步:利用优先级队列把数组数据按照大堆排列,从而可以确保每次都对最大偶数操作

使用大堆可以用比暴力查找更少的时间完成最大数据的提取,其实本题也可以解释为查找前k个最大偶数,不过这前k个是动态的

基本逻辑:对最大偶数除2,若为奇数,弹出堆并加入sum中

若为偶数,弹出原数据,然后插入除2后的数据

注意:

1.while循环需要保证队列中还有数据,否则后面的top会有问题

2.对于最大偶数除2后的数据无论如何都要删除

分类1:变成了奇数,奇数无法进行除2操作,自然要删除

分类2:变成了偶数,如果不删除,那么后续我们插入除2后的数据就会导致数据冗余了

(3)第三步:操作k次后,如果还有数据存储在队列中,将剩下的数据加上即可

除2!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值