题意
小a和小b去书店买书,书店共有n本书,现在每本书有三个参数x, y, z分别表示小a是否喜欢该书(是为1否为0)小b是否喜欢该书,以及该书的价格,现在他们想一起花费最少的价钱买一些书使得买的书中至少自己喜欢$k$本。
算法分析
注意到,两个人满意书的数量必须都达到$k$这个题才算结束,而一本书最多只能使得一个人满意的书加$1$,所以如果选择了一本a喜欢b不喜欢的书,那么必须要选择一本a不喜欢b喜欢的书,那么我们就可以按照价格排序,把a喜欢b不喜欢的书和a不喜欢b喜欢的书合并成ab都喜欢的书,再按照价格贪心的选取就可以了。
C++ 代码
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
if(a < b) {
a = b;
return true;
}
return false;
}
template<class T>
inline bool chmin(T &a, T b) {
if(a > b) {
a = b;
return true;
}
return false;
}
const long long INF = 1e11;
vector<ll> v[2][2];
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
ll N, K;
cin >> N >> K;
for(int i = 0; i < N; i++) {
ll t, a, b;
cin >> t >> a >> b;
v[a][b].push_back(t);
}
ll ans = INF;
for(int i = 0; i <= 1; i++) {
for(int j = 0; j <= 1; j++) {
for(int k = 0; k <= K; k++) {
v[i][j].push_back(INF);
}
sort(v[i][j].begin(), v[i][j].end());
}
}
ll now = 0;
for(int i = 0; i < K; i++) {
now += v[1][1][i];
}
chmin(ans, now);
for(int i = 0; i < K; i++) {
now -= v[1][1][K-1-i];
now += v[0][1][i];
now += v[1][0][i];
chmin(ans, now);
}
if(ans >= INF) ans = -1;
cout << ans << endl;
return 0;
}