70pts求助:是这样写不对吗
查看原帖
70pts求助:是这样写不对吗
311110
_djc_楼主2022/10/3 20:10

思路是贪心,都加入一个堆中,因为有p也有c所以用vis记录有没有被取过,然后看是否可以选。堆的第三元是在记录是否能用k

#include <bits/stdc++.h>
#define maxn 600005
#define int long long
using namespace std;
int n, k, m;
int vis[maxn];
priority_queue<pair<int, pair<int, int> > > q;
signed main(){
	cin >> n >> k >> m;
	for (int i = 1, p, c; i <= n; i++) {
		cin >> p >> c;
		q.push(make_pair(-p, make_pair(i, 0)));
		q.push(make_pair(-c, make_pair(i, 1)));
	}
	int cnt = 0;
	while (!q.empty()) {
		int x = -q.top().first, y = q.top().second.first, opt = q.top().second.second;
		q.pop();
		if (vis[y]) continue;
		if (m >= x && k - opt >= 0) cnt++, m -= x, k -= opt;
	}
	cout << cnt;
}
2022/10/3 20:10
加载中...