题解|除2!
除2!
因为我们的目的是让数组尽可能地小,所以我们每次就对数组中最大的偶数/2,重复k次即可。
解法:我们先将数组全部加起来,同时将偶数放入一个大堆中。等到数据输入完毕,接着进行k次操作,每次操作都取出堆顶的数据,让总和减去该数的一半,并且从堆中删除该数。接着判断除2之后是否为偶数,如果是将结果放回堆中,反之重新取堆顶。重复k次即可,但是在k次操作中,我们要保证堆不为空才行。
#include <iostream> #include <queue> using namespace std; int n = 0; int k = 0; long long sum; int tmp = 0; priority_queue<int> heap; int main() { cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> tmp; sum += tmp; if(tmp % 2 == 0) heap.emplace(tmp); // 偶数放入大堆 } // 进行k次操作 while (k-- && !heap.empty()) { tmp = heap.top() / 2; heap.pop(); sum -= tmp; // 减去最大偶数的一半 if (tmp % 2 == 0) heap.emplace(tmp); } cout << sum << endl; return 0; }