小 X 的 AK 计划
题目大意:
有n个点,到一个点(时间为距离)并花一些时间可以A掉此点,问最多可以A多少个点
原题:
解题思路:
先按位置从小到大排序,然后到每一个点并A掉的时间加在一起,当大于m时,把A掉的点中花费时间最多的去除掉(用STL的大根堆来处理)
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long n,m,x,y,l,sum,num,ans;
struct rec
{long long v,t;
}a[100005];
bool cmp(rec xx,rec yy)
{return xx.v<yy.v;
}
int main()
{scanf("%lld %lld",&n,&m);for (int i=1;i<=n;++i){scanf("%lld %lld",&x,&y);if (x+y>m)continue;//优化,感性理解a[++l].v=x;a[l].t=y;}sort(a+1,a+1+l,cmp);//排序priority_queue<int>d;//大根堆for (int i=1;i<=l;++i){sum+=a[i].t+a[i].v-a[i-1].v;//加在一起d.push(a[i].t);//入堆num++;if (sum>m){sum-=d.top();//减去d.pop(); //出堆num--;}ans=max(ans,num);//求最大}printf("%lld",ans);//输出
}