1.链接
2.题目
3.代码
#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;
}
3.错误代码
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
ll n,k;
priority_queue<ll> heap;
int main()
{
cin >> n >> k;
int sum,x;
sum = 0;
while(n--)
{
cin >> x;
sum += x;
if( x % 2 == 0) heap.push(x);
}
while(heap.size() && k--)
{
heap.pop();
ll tmp = heap.top() / 2;
sum -= tmp;
if(tmp % 2 == 0) heap.push(tmp);
}
cout << sum << endl;
return 0;
}
4.思路
大根堆特性