分析
n n n的范围很小,可以 O ( n 2 ) O(n^2) O(n2)枚举,观察可以看出,选了几个数,他们的 b i b_i bi 计算总和的方法也就是将最左侧的 b i b_i bi到最右侧的 b i b_i bi 的距离,可以通过大根堆维护中途的最大数量,枚举左右端点。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
int n;
ll l;
cin >> n >> l;
vector<pair<ll, ll>> a(n + 1);
for(int i = 1; i <= n; i ++) cin >> a[i].second >> a[i].first;
sort(a.begin() + 1, a.end());
int ans = 0;
for(int i = 1; i <= n; i ++) {
priority_queue<ll> heap;
ll sum = 0;
for(int j = i; j <= n; j ++) {
heap.push(a[j].second);
sum += a[j].second;
while(heap.size() && a[j].first - a[i].first + sum > l) {
ll maxn = heap.top();
heap.pop();
sum -= maxn;
}
ans = max(ans, (int)heap.size());
}
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T --) {
solve();
}
}