
一、题目描述

二、算法原理
思路:贪心 + 堆
建立一个共识:所有的偶数中,依次升序,那么我们只要把最大的偶数/2就比任何偶数/2的所有偶数的总值要小,例如:2 4 6 ,sum = 12,2 4 3 ,sum = 9,2 2 6 ,sum = 10,1 4 6 ,sum = 11
1)首先建立个大根堆,当我们存储数据时,创建一个变量记录所有值的和,当输入的数据为偶数时入堆;
2)此时我们的大根堆里面全是偶数,而且我们的 sum 也记录所有的值的和,我们使用一个 while 循环(堆不为空,k不等于0,而且要 k 要 -- ,因为堆里面全是偶数,所以最少要进行一次 k 操作),在 while 循环中,我们拿到堆顶的元素,记住要出堆,我们把这个元素直接除2,此时 sum 要减去元素/2的值,因为 sum 记录是所有(包含偶数没除2)的值,元素/2 的值要再次判断该值是否是偶数,是偶数就入堆;
三、代码实现
cpp
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main()
{
long long n = 0, k = 0;
cin >> n >> k;
//准备工作
priority_queue<long long> que;//大根堆
long long sum = 0;
for(long long i = 0; i < n; i++)
{
long long m = 0;
cin >> m;
sum += m;
if(m % 2 == 0)//偶数入堆
{
que.push(m);
}
}
while(!que.empty() && k--)
{
long long tmp = que.top() / 2;
que.pop();//出堆
sum -= tmp;//总值减去
if(tmp % 2 == 0) que.push(tmp);
}
cout << sum << endl;
return 0;
}