根据差值按大小顺序排,选出前k个,其他的选两个值中较小的即可。
#include <iostream>
#include <cstdio>
#include <list>
#include <stack>
#include <queue>
#include <cstdlib>
#include <set>
#include <map>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
int a[200005], b;
struct num {
int a, b;
int c;
friend bool operator<(const num&a, const num&b) {
return a.c > b.c;
}
};
priority_queue<num> q;
int main()
{
int n, k;
while (cin >> n >> k) {
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; ++i) {
scanf("%d", &b);
q.push(num{ a[i],b,a[i] - b });
}
int c = 0;
int sum = 0;
while (c != k) {
num t = q.top();
q.pop();
sum += t.a;
c++;
}
while (!q.empty()) {
num t = q.top();
q.pop();
sum += min(t.a, t.b);
}
cout << sum << endl;
}
return 0;
}