【题解】NowCoder 除2!

server/2024/10/15 16:00:34/

题目来源:牛客

除2!

题目描述:

给一个数组,一共有 n 个数。
你能进行最多 k 次操作。每次操作可以进行以下步骤:
 · 选择数组中的一个偶数 ai ,将其变成 ai / 2
现在你进行不超过 k 次操作后,让数组中所有数之和尽可能小。请输出这个最小的和。

输入描述:

第一行输入两个正整数 nk,用空格隔开
第二行输入 n 个正整数 ai
数据范围:
1 ≤ n ≤ 100000 , 1 ≤ k ≤ 109
1 ≤ ai ≤ 109

输出描述:

一个正整数,代表和的最小值。

示例1

输入:5 3
   2 4 8 10 11
输出:24
说明:对8操作2次,对10操作1次,最后的数组是2 4 2 5 11。可以证明这样的操作是最优的。

解析

要使最后的结果最小,我们可以每次对最大的那个偶数进行除2操作,这样可以保证每次操作都是最优解,最终的结果就能保证最小。我们可以使用大根堆(优先队列)来存储偶数,一定是偶数,因为奇数是不参与操作的。每次对堆顶的元素进行除2操作,如果还是偶数则放回到堆中,如果不是偶数则不放回。当堆中没有元素或者操作次数用完时,得到的结果就是最终答案。
因为我们要对数组求和,而数组中的元素可以达到 109 ,并且个数也能达到 105 所以我们要对答案开 long long

代码实现

#include<iostream>
#include<queue>
using namespace std;long long n, k, sum;
priority_queue<long long> pq;int main()
{cin >> n >> k;// 临时变量用来接收输入int tmp = 0;while (n--){cin >> tmp;sum += tmp;// 偶数入堆if (tmp % 2 == 0){pq.push(tmp);}}// 还有偶数可以操作并且还有操作次数while (pq.size() && k--){// 取出堆顶元素(最大的偶数)并除2操作long long x = pq.top() / 2;pq.pop();// 总和减少sum -= x;// 除2后还是偶数则需要再次入堆if (x % 2 == 0){pq.push(x);}}cout << sum;return 0;
}

http://www.ppmy.cn/server/23721.html

相关文章

NFTScan | 04.22~04.28 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.04.22~ 2024.04.28 NFT Hot News 01/ ApeCoin DAO 发起「由 APE 代币支持的 NFT Launchpad」提案投票 4 月 22 日&#xff0c;ApeCoin DAO 社区发起「由 APE 代币支持的 NFT Launch…

Swift - 枚举

文章目录 Swift - 枚举1. 枚举的基本用法2. 关联值&#xff08;Associated Values&#xff09;3. 关联值举例4. 原始值5. 隐式原始值&#xff08;Implicitly Assigned Raw Values&#xff09;6. 递归枚举&#xff08;Recursive Enumeration&#xff09;7. MemoryLayout Swift -…

buuctf——web题目练习

1.极客大挑战2019 easysql 密码或者用户输入万能密码即可 关于万能密码的理解和原理&#xff0c;可以参考这篇BUUCTF[极客大挑战 2019] EasySQL 1_[极客大挑战 2019]easysql 1-CSDN博客 2.极客大挑战2019 have fun 题目源码 需要构造payload 网页传参可参考&#xff1a;…

3、Flink执行模式(流/批)详解(上)

0、批模式和流模式对比表 类别流模式批模式任务调度所有任务需要持续运行&#xff0c;消耗资源大任务可以按Shuffle分阶段执行&#xff0c;消耗资源小Shuffle记录会被流水线式的持续发送到下游任务&#xff0c;在网络上进行缓冲可以保存Shuffle分阶段执行的中间结果State Back…

Java面试题:Spring里面的@RestController和@ResponseBody有什么作用?

ResponseBody ResponseBody一般是加在方法上&#xff0c;将返回的对象解析成xml或者json&#xff0c;返回给请求的调用者。一般是用于服务之间的调用&#xff0c;或者前端请求后端时&#xff0c;使用ajax请求。 如果不加ResponseBody&#xff0c;一般就是返回的url&#xff0c…

Stable Diffusion 常用放大算法详解

常用放大算法 图像放大算法大致有两种: 传统图像放大算法(Lantent、Lanczos、Nearest)AI图像放大算法(4x-UltraSharp、BSRGAN、ESRGAN等)传统图像放大算法是基于插值算法,计算出图像放大后新位置的像素值。AI图像放大算法,比一般的传统图像放大算法效果更好。 推荐放大…

21 JavaScript 学习:一些误区和易错点

赋值运算符应用错误 在 JavaScript 中&#xff0c;赋值运算符&#xff08;Assignment Operators&#xff09;用于给变量赋值。常见的赋值运算符包括 、、-、*、/ 等。如果赋值运算符的应用不正确&#xff0c;可能会导致程序出现错误或产生意外的结果。 以下是一些常见的赋值运…

Ansible一键部署zabbix+grafana+agent

目录 IP地址规划ansible安装分开部署安装zabbix-mysql安装zabbix-server安装zabbix-agent安装zabbix-grafana 一键部署自动发现 IP地址规划 名字地址主要安装软件ansible-server192.168.40.137zabbix-server、ansible、zabbix-mysqlzabbix-agent1192.168.40.138zabbix-agentza…