给定m,在代价小于等于m的情况下最多能选择多少个元素。
思路:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, inf = 1e18, maxm = 4e4 + 5, base = 397;
const int mod = 1e9 + 7;
// const __int128 mod = 212370440130137957LL;
const int N = 1e6;
// int a[1005][1005];
int a[maxn], b[maxn];
bool vis[maxn];
int n, m;
string s;
struct Node{
// int val, id;
// bool operator<(const Node &u)const{
// return val < u.val;
// }
int a, b;
bool operator<(const Node &u)const{
return b < u.b;
}
}c[maxn];
int ans[maxn], pre[maxn];
void solve(){
int res = 0;
int k, q;
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> c[i].a >> c[i].b;
}
sort(c + 1, c + n + 1);
res = 0;
int sum;
for(int i = 1; i <= n; i++){
priority_queue<int> pq;
sum = 0;
for(int j = i; j <= n; j++){
pq.push(c[j].a);
//a[i]和a[j]都push到pq里面,如果a[i]或a[j]是当前a最大的,也会被pop,虽然是非法的,但是不会影响答案,
// 因为这个肯定不是最优的,存在k < j, 在[i, k]中选的答案更优
sum += c[j].a;
while(sum + c[j].b - c[i].b > m && !pq.empty()){
sum -= pq.top();
pq.pop();
}
res = max(res, (int)pq.size());
}
}
cout << res << '\n';
//错误做法:
/*
hack:
n = 5, m = 10
a: 1 2 3 5 4
b: 1 1 1 1 1
当i = 1,j = 4时,不会选3,当j = 5时,也不会选3
然而最优解是选1 2 3 4
*/
// int sum, cnt;
// for(int i = 1; i <= n; i++){
// priority_queue<int> sel;
// sum = c[i].a;
// if(sum > m){
// continue;
// }
// res = max(res, 1LL);
// for(int j = i + 1; j <= n; j++){
// sum += c[j].a + c[j].b - c[i].b;
// if(j - i >= 2){
// if(sum + c[j - 1].a <= m){
// sum += c[j - 1].a;
// cnt++;
// sel.push(c[j - 1].a);
// }
// else{
// if(!sel.empty() && sel.top() > c[j - 1].a){
// int val = sel.top();
// sel.pop();
// sel.push(c[j - 1].a);
// sum += c[j - 1].a - val;
// }
// }
// }
// if(sum <= m){
// res = max(res, (int)sel.size() + 2);
// }
// sum -= c[j].a + c[j].b - c[i].b;
// }
// }
// cout << res << '\n';
// priority_queue<Node, vector<Node>, greater<Node>> other;
// other.push({2, 1});
// other.push({1, 3});
// other.push({2, 0});
// cout << other.top().b << '\n';
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}