E1. Reading Books (easy version)[贪心,模拟]

注 意 把 这 些 分 成 三 类 \color{Red}注意把这些分成三类

Ⅰ . A l i c e 和 B o b 都 喜 欢 的 Ⅰ.Alice和Bob都喜欢的 .AliceBob

Ⅱ . 只 有 A l i c e 喜 欢 的 Ⅱ.只有Alice喜欢的 .Alice

Ⅲ . 只 有 B o b 喜 欢 的 Ⅲ.只有Bob喜欢的 .Bob

那 么 不 妨 先 不 考 虑 Ⅰ 这 一 类 , 因 为 暂 时 我 们 还 难 以 抉 择 那么不妨先不考虑Ⅰ这一类,因为暂时我们还难以抉择 ,

从 Ⅱ 类 选 出 最 小 的 k 本 书 , 从 Ⅲ 类 选 出 最 小 的 k 本 书 从Ⅱ类选出最小的k本书,从Ⅲ类选出最小的k本书 k,k

如 果 不 足 k 本 数 , 那 么 拿 最 少 的 一 些 Ⅰ 类 来 填 充 直 到 都 满 足 有 k 本 书 如果不足k本数,那么拿最少的一些Ⅰ类来填充直到都满足有k本书 k,k

那 么 现 在 已 经 满 足 都 有 书 了 , 如 果 还 要 减 小 答 案 那么现在已经满足都有书了,如果还要减小答案 ,

必 然 是 拿 当 前 最 划 算 的 Ⅰ 类 去 替 换 B o b 和 A l i c e 各 自 选 的 代 价 最 大 的 书 必然是拿当前最划算的Ⅰ类去替换Bob和Alice各自选的代价最大的书 BobAlice

划 算 就 替 换 划算就替换

剩下的就是您的模拟功底了吖~~~~

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
struct p{
	int t,a,b;
}s[maxn],q[maxn],w[maxn];//分别代表一二三类别 
int top1,top2,top3,ans;
bool com(p a,p b){
	return a.t<b.t;
}
void over(){
	cout<<-1;exit(0);
}
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		p f;
		cin>>f.t>>f.a>>f.b;
		if(f.a&&f.b)	s[++top1]=f;
		else if(f.a)	q[++top2]=f;
		else if(f.b)	w[++top3]=f;
	}
	sort(q+1,q+1+top2,com);
	sort(w+1,w+1+top3,com);
	sort(s+1,s+1+top1,com);
	for(int i=1;i<=k;i++)	ans=ans+(q[i].t+w[i].t);//先选掉k本书(如果够) 
	top2=min(top2,k);top3=min(top3,k);//看看当前选了几本书 
	int lq=top2,lw=top3;
	int minn=min(top2,top3),be=1;
	if(minn<k)//如果没有选满,那就去填充 
	{
		if(k-minn>top1)	over();//书不够的,输出-1 
		be=k-minn+1;
		for(int i=1;i<=k-minn;i++)//至少要添加这么多
		{
			if(lq<k&&lw<k)	lq++,lw++,ans+=s[i].t;
			else if(lq<k)
			{
				lq++;
				if(top3)	ans=ans-w[top3--].t+s[i].t;	
			}	
			else if(lw<k)
			{
				lw++;
				if(top2)	ans=ans-q[top2--].t+s[i].t;
			}
		}
	}
	for(int i=be;i<=top1;i++)//每次拿最划算的去替换 
	{
		int hao=q[top2].t+w[top3].t;
		if(hao>s[i].t)
		{
			ans=ans+s[i].t-hao;
			if(top2)	top2--;
			if(top3)	top3--;
		}	
	} 
	cout<<ans;
}