返回顶部

Codeforces Round #653 (Div. 3) E1. Reading Books (easy version) (贪心,模拟)

  • 题意:有\(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;
    }
    
    
posted @ 2020-06-29 13:49  _Kolibri  阅读(239)  评论(0)    收藏  举报