涉及算法:模拟+贪心+堆
思路:
- 将所有偶数都放进一个大堆heap中
- 每次除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;
}

京公网安备 11010502036488号