E1. Reading Books (easy version)(贪心)

题目链接:Problem - 1374E1 - Codeforces

题意:

Alice 和 Bob 一共有 n 本书要读。第 i 本书有三个属性:阅读时间 ti​(

(1≤ti≤1e4),ai​(为 1 表示 Alice 喜欢这本书,为 0 表示 Alice 不喜欢),bi​(为 1 表示 Bob 喜欢这本书,为 0 表示 Bob 不喜欢)。

他们需要从这些书中选择若干本,这些书中至少有 k 本是 Alice 喜欢的,至少有 k 本是 Bob 喜欢的。且阅读的总时间最小 (1≤k≤n≤2e5).,最终输出最小总的阅读时间,如果没有满足题目要求的方案,输出-1.

题解:

因为题目说至少有 k 本是 Alice 喜欢的,至少有 k 本是 Bob 喜欢的,所以当 Alice选了一本自己喜欢的书, Bob也一定会选一本自己喜欢的书。因此,我们可以用贪心的方法合并两人选书过程:将两个人单独喜欢的书分别排序,然后从小到大两两合并,然后当成他俩都喜欢的书,价格为这两本书的和。然后与两个人均喜欢的书的价格进行合并后排序。如果合并后两人均喜欢的书仍不足k,那么输出-1.如果满足k,则连续加k本排序后的书,最终结果为最小总的阅读时间。

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string.h>
#include<map>
#include<queue>
#include<vector>
#include<set>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const ll mm = 2e5+ 60;
const int inf = 0x3f3f3f3f;
ll n, k, a, b, c, f1[mm], f2[mm], f3[mm],c1=0,c2=0,c3=0,ans=0;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		cin >> a >> b >> c;
		if (b == 0 && c == 0) continue;
		if (b == 0 && c == 1) f3[++c3] = a;
		if (b == 1 && c == 0) f2[++c2] = a;
		if (b == 1 && c == 1) f1[++c1] = a;
	}
	sort(f3 + 1, f3 + c3 + 1);
	sort(f2 + 1, f2 + c2 + 1);
	for (int i = 1; i <= min(c3, c2); i++)f1[++c1] = f3[i] + f2[i];
	sort(f1 + 1, f1 + c1+ 1);
	if (c1 < k) {
		cout << -1;
		return 0;
	}
	for (int i = 1; i <= k; i++) ans += f1[i];
	cout << ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值