E1. Reading Books (easy version)(贪心)

​传送门​

思路:贪心。

有四种类型物品:

1.两个人都能拿。

2.只有 A A A能拿。

3.只有 B B B能拿。

4.都不能拿。

显然第4种不用考虑。

显然根据贪心思想,最优解肯定是 A 和 B A和B A和B刚好拿 k k k个。

所以考虑将类型 2 , 3 2,3 2,3转换为 1 1 1做。

分别将 2 , 3 2,3 2,3类型排序,然后每次取最小的为一组加入到类型 1 1 1中。

再对类型 1 1 1排序,选前 k k k个即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
int main(){
int n,k;
scanf("%d%d",&n,&k);
vector<int>s,a,b;
for(int i=1;i<=n;i++){
int t,x,y;
scanf("%d%d%d",&t,&x,&y);
if(x&&y) s.push_back(t);
else if(x) a.push_back(t);
else if(y) b.push_back(t);
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int i=0;i<min(a.size(),b.size());i++)
s.push_back(a[i]+b[i]);
if(s.size()<k) puts("-1");
else {
sort(s.begin(),s.end());
ll ans=0;
for(int i=0;i<k;i++) ans+=s[i];
printf("%lld\n",ans);
}
return 0;
}