原题:https://www.luogu.org/problemnew/show/P2107
题目有两个限制条件,一个是距离,一个是时间。
距离先不用管,排完序按顺序来就可以,近的总比远的更优。
先把所有超m范围的去掉。
耗费时间则是越短的越划算,越长的越浪费。所以可以选择大根堆,把时间长短都存入堆中。
加入超了是可以翻悔的,取堆顶,把最大的翻悔了,路程不用管,因为你已经过之前的了。
不要忘了每次更新答案!不一定越往后越优,每次都要取一个max,我第一次这么忘了结果WA了三个点。
代码如下:
#include<bits/stdc++.h> #define pp(x) printf("%lld",x) #define rr(x) scanf("%lld",&x) #define ll long long using namespace std; priority_queue<long long> q; ll n,m,tot; ll sum,ans,ser; struct node{ ll x,t; }s[100001]; inline bool cmp1(node a,node b){ return a.x<b.x; } int main() { rr(n);rr(m); for(int i=1;i<=n;i++){ ll x,y; rr(x);rr(y); if(x<=m&&y<=m){ s[++tot].x=x; s[tot].t=y; } } sort(s+1,s+tot+1,cmp1); for(int i=1;i<=tot;i++){ sum+=s[i].t+s[i].x-s[i-1].x; ans++; q.push(s[i].t); while(sum>m){ sum-=q.top(); q.pop(); ans--; } ser=max(ans,ser); } pp(ser);puts(""); return 0; }