这个题也是典型的用大根堆解决的问题,思路就是咱们让这个堆里的最大元素除二。但需要注意的是,如果这个元素除2后还是偶数,需要在放回堆里。
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int> heap;
typedef long long LL;
//别忘了开long long
//不开long long过不了
LL n, k, sum;
LL x;
//保证sum最小,那么每次除2的对象应该是数组里的最大偶数
int main()
{
cin >> n >> k;
for (LL i = 0;i < n;i++)
{
//这里没有必要真的搞一个数组出来存储这些数据
cin >> x;
if (x%2==0)
{
//如果是偶数那么就插入堆
heap.push(x);
}
sum += x;//所有元素之和
}
//k次操作
while (heap.size()&&k--)//要保证我们的heap里有元素
{
LL a = heap.top();
sum -= (a/ 2);
heap.pop();
if((a/2)%2==0)//如果该数除以2仍然是偶数,那么就插入回去
{
a /= 2;
heap.push(a);
}
}
cout << sum<<endl;
return 0;
}
好了,今天的内容就分享到这,我们下期再见!
因篇幅问题不能全部显示,请点此查看更多更全内容