E1. Reading Books (easy version)[贪心,模拟]
注 意 把 这 些 分 成 三 类 \color{Red}注意把这些分成三类 注意把这些分成三类
Ⅰ . A l i c e 和 B o b 都 喜 欢 的 Ⅰ.Alice和Bob都喜欢的 Ⅰ.Alice和Bob都喜欢的
Ⅱ . 只 有 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各自选的代价最大的书 必然是拿当前最划算的Ⅰ类去替换Bob和Alice各自选的代价最大的书
划 算 就 替 换 划算就替换 划算就替换
剩下的就是您的模拟功底了吖~~~~
#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;
}