题意:有\(n\)本书,A和B都至少要从喜欢的书里面读\(k\)本书,如果一本书两人都喜欢的话,那么他们就可以一起读来节省时间,问最少多长时间两人都能够读完\(k\)本书.
题解:我们可以分\(3\)种情况来存,即:
? 1.\(a=b=1\). 2.\(a=1,b=0\). 3.\(a=0,b=1\).
对于2和3来说,我们可以将他们排序,然后合并到一起,最后放到第1种情况中再排一次序,取前\(k\)个前缀和即可.
代码:
int n,k;
int t,x,y;
int ans;
vector<int> a,b,c;
int main() {
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;++i){
cin>>t>>x>>y;
if(x==1 && y==1){
a.pb(t);
}
if(x==1 && y==0){
b.pb(t);
}
if(x==0 &&y==1){
c.pb(t);
}
}
if(b.size()>c.size()) swap(b,c);
if(a.size()+b.size()<k) cout<<-1<<endl;
else{
sort(b.begin(),b.end());
sort(c.begin(),c.end());
for(int i=0;i<b.size();++i){
b[i]+=c[i];
}
sort(b.begin(),b.end());
for(int i=0;i<b.size();++i){
a.pb(b[i]);
}
sort(a.begin(),a.end());
for(int i=0;i<k;++i){
ans+=a[i];
}
cout<<ans<<endl;
}
return 0;
}
Codeforces Round #653 (Div. 3) E1. Reading Books (easy version) (贪心,模拟)
原文:https://www.cnblogs.com/lr599909928/p/13207617.html