Select solution language
Nhận xét: Con đường hái hoa tối ưu nhất của Marisa là hái những bông hoa ở những vị trí theo thứ tự tăng dần, có nghĩa là nếu Marisa hái bông hoa ở vị trí x thì bông hoa tiếp theo Marisa có thể hái phải là y với y > x.
Giả sử: Marisa hái bông hoa ở vị trí x
Rõ ràng Marisa hái hoa ở vị trí x rồi hái hoa ở vị trí y (y > x) là phương pháp tối ưu nhất.
Code:
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=a; i<=b; ++i)
template<class X, class Y>
bool maximize(X &x, const Y &y){return (x < y) ? x = y, 1 : 0;}
#define ii pair<int,int>
const int MAXN = 1e6 + 5;
priority_queue<int> pq;
int n,m;
ii a[MAXN];
signed main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
FOR(i,1,n) cin >> a[i].first >> a[i].second;
sort(a+1,a+n+1);
int res = 0;
int cur = 0;
FOR(i,1,n)
{
pq.push(a[i].second);
cur += a[i].second;
while (pq.size() && cur + a[i].first > m)
{
cur -= pq.top();
pq.pop();
}
maximize(res,pq.size());
}
cout << res;
return 0;
}