思路是贪心,都加入一个堆中,因为有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;
}