http://codeforces.com/contest/779/problem/C

$n$個のもの全てを今週と来週に分けて買いたい.$i$番目の今週の値段は$a_i$で,来週の値段は$b_i$である.少なくとも今週に$k$個買わなければならない時に,必要となる最小の金額を求める.

基本的に来週になると高くなるものは今週買い,安くなるものは来週買った方が良い.今週買った方が良いものが$k$個未満の場合は,来週買った方が良いものから安くなる金額が少ない順に買う.

#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define REP(i,k,n) for(int i=k;i<(int)(n);i++)
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define INF 1<<30
#define mp make_pair
#define fi first
#define se second

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

bool flag[200005];

int main() {
	int n, k;
	cin >> n >> k;

	vector<P> v(n);
	rep(i, n) cin >> v[i].fi;
	rep(i, n) cin >> v[i].se;

	memset(flag, 0, sizeof(flag));
	priority_queue<P, vector<P>, greater<P> > que;
	rep(i, n) {
		if(v[i].fi - v[i].se > 0) {
			que.push(mp(v[i].fi - v[i].se, i));
			flag[i] = true;
		}
	}

	int now = n - que.size();
	while(now < k) {
		P p = que.top(); que.pop();
		now++;
		flag[p.se] = false;
	}
	
	ll ans = 0;
	rep(i, n) {
		if(flag[i]) ans += v[i].se;
		else ans += v[i].fi;
	}

	cout << ans << endl;

	return 0;
}