当前位置: 代码迷 >> 综合 >> CF1374E1 Reading Books (easy version)
  详细解决方案

CF1374E1 Reading Books (easy version)

热度:62   发布时间:2023-11-27 00:14:30.0

CF传送门

题目大意:Alice和Bob一共有 n n n本书要读。第 i i i本书有三个属性:阅读时间 t i t_i ti?, a i a_i ai?(为 1 1 1表示 Alice喜欢这本书,为 0 0 0表示Alice不喜欢), b i b_i bi?(为 1 1 1表示Bob喜欢这本书,为 0 0 0表示Bob不喜欢)
他们需要从这些书中选择若干本,满足:

  • 这些书中至少有 k k k本是Alice喜欢的,至少有 k k k本是Bob喜欢的。
  • 阅读的总时间最小(总时间为选中的书的 t i t_i ti?的总和)

思路:思维题
对于这 n n n本书,我们可以分为三类,A、B都喜欢的,A喜欢的,B喜欢的(都不喜欢的书直接扔了)我们把这三类书每本所花时间用三个数组 t 1 t_1 t1? t 2 t_2 t2? t 3 t_3 t3?记录

  • 因为A、B都要至少有 k k k本喜欢,那么我们判断到底能否满足这个条件就看 t 1 . s i z e + m i n ( t 2 . s i z e , t 3 . s i z e ) > = k t_1.size+min(t_2.size,t_3.size)>=k t1?.size+min(t2?.size,t3?.size)>=k是否成立
  • 为了让时间尽量小,首先我们将 t 2 t_2 t2? t 3 t_3 t3?按升序排序,取 m i n ( t 2 . s i z e , t 3 . s i z e ) min(t_2.size,t_3.size) min(t2?.size,t3?.size)个,将对应和加入 t 1 t_1 t1?,再将 t 1 t_1 t1?升序排序,取前 k k k项即为所求

Code:

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10,mod=1e9+7;
typedef long long ll;ll n,k,t1[N],t2[N],t3[N];
ll a,b,c;
int main(){
    ll cnt1=0,cnt2=0,cnt3=0;cin>>n>>k;for(int i=1;i<=n;i++){
    cin>>a>>b>>c;if(b==0&&c==0) continue;if(b==1&&c==0) t1[++cnt1]=a;if(b==0&&c==1) t2[++cnt2]=a;if(b==1&&c==1) t3[++cnt3]=a;}	sort(t1+1,t1+cnt1+1);sort(t2+1,t2+1+cnt2);for(int i=1;i<=min(cnt2,cnt1);i++) t3[++cnt3]=t1[i]+t2[i];sort(t3+1,t3+1+cnt3);ll ans=0;if(cnt3<k) cout<<"-1"<<endl;else{
    for(int i=1;i<=k;i++) ans+=t3[i];cout<<ans<<endl;}return 0;
}
  相关解决方案