涉及算法:模拟+贪心+堆
思路:
  1. 将所有偶数都放进一个大堆heap中
  2. 每次除2时,取出堆顶(最大的偶数)元素top进行除2操作。判断操作后的top是否为偶数,如果是,则将它插入到堆heap中;如果不是,则将最终结果加上该奇数。重复次操作,直到堆为空或执行完k次
C++代码实现:
#include <iostream>
#include <queue>
using namespace std;

int n, k;

long long sum; // 统计最终的和

int main()
{
    // 建一个大堆
    priority_queue<long long> heap;
    cin >> n >> k;
    
    int t = 0;
    while(n--)
    {
        cin >> t;
        if(t % 2 != 0) sum += t; // 奇数,则计算和
        else heap.push(t); // 偶数,则插入堆中去
    }
    
    // k次除2
    while(k-- && !heap.empty())
    {
        // 选出堆顶元素(最大的偶数)进行除2
        int top = heap.top() / 2;
        if(top % 2 != 0)
        {
            sum += top;
            heap.pop();
        }
        else
        {
            heap.pop();
            heap.push(top);
        }
    }
    
    // 处理堆中剩余的元素
    while(!heap.empty())
    {
        sum += heap.top();
        heap.pop();
    }
    
    cout << sum; 
    return 0;
}