样例输入
3 1
1 2 3
3 2 1
样例输出
8
说明
将第一张卡牌翻转,此时卡牌的总和为 3+2+3=8。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
ll a[N], b[N];
int main() {
int n, k; cin >> n >> k;
ll ans = 0;
priority_queue<ll, vector<ll>> pq;
//记录正面的点数,并累加至ans
for (int i = 1; i <= n; ++i) {
cin >> a[i];
ans += a[i];
}
//记录背面的点数,并计算不同位置翻拍的贡献,用优先队列维护
for (int i = 1; i <= n; ++i)
cin >> b[i];
for (int i = 1; i <= n; ++i) {
ll diff = b[i]-a[i]; // 计算贡献
pq.push(diff); // 压入大根堆
}
//由于题目说了最多进行k次操作,所以只进行贡献>0的翻牌就可以了
for (int i = 1; i <= k; ++i) {
if (pq.top() > 0) {
ll max = pq.top();
pq.pop();
ans += max;
}
else break;
}
cout << ans;
return 0;
}