【题解】NowCoder 除2!

简介: 【题解】NowCoder 除2!

题目来源:牛客

除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;
}
目录
相关文章
|
7月前
|
算法
【牛客网算法】NP13 格式化输出(三)
该文档是关于一个编程问题的描述,要求编写代码来去除字符串两端的多余空白符。输入是一个带有两侧空白符的用户名`name`,目标是输出去掉空白符后的原始名字。提供的示例输入是&quot; Niuniu &quot;,输出应为&quot;Niuniu&quot;。建议的解决方案包括使用`.strip()`,`.lstrip()`,`.rstrip()`或`.replace()`方法。提供的代码示例使用`.lstrip()`来处理输入。
46 0
|
6月前
|
知识图谱
【题解】NowCoder BC64 牛牛的快递
【题解】NowCoder BC64 牛牛的快递
44 7
|
6月前
【题解】NowCoder Fibonacci数列
【题解】NowCoder Fibonacci数列
21 0
【题解】NowCoder Fibonacci数列
|
6月前
|
容器
【题解】NowCoder NC313 两个数组的交集
【题解】NowCoder NC313 两个数组的交集
41 6
|
6月前
|
人工智能 算法 vr&ar
【题解】NowCoder dd爱框框
【题解】NowCoder dd爱框框
37 0
|
6月前
|
缓存 算法 数据可视化
LeetCode 题目 119:杨辉三角 II
LeetCode 题目 119:杨辉三角 II
|
6月前
|
存储 SQL 算法
LeetCode 题目 118:杨辉三角
LeetCode 题目 118:杨辉三角
|
存储 算法
(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习
|
算法 C语言 C++
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(下)
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(上)
递归的写法看起来简洁,实际并没有迭代写法好理解,而且在空间复杂度上也比迭代高,这里的递归写法思路主要是先向下找到尾结点后,向上逐个返回,如果等于val值,就将该节点上一个元素直接指向该节点下一个元素,等于是将该点从链表中删除了
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(上)

热门文章

最新文章