贪心思想,优先队列处理,用set应该也可以。
#include "cstring"
#include "iostream"
#include "algorithm"
#include "cstdio"
#include "queue"
#include "set"
using namespace std;
typedef long long LL;
const int M=100050;
const int maxn=2147483648;
const int INF = 0x3f3f3f3f;
int n,m,p;
//set<int>q;
struct node
{
int a,b;
bool operator <(const node &c)const
{
return b<c.b;
}
} s[M];
priority_queue<node> q;
bool cmp(node x,node y)
{
if(x.a==y.a)
return y.b>x.b;
else
return y.a>x.a;
}
int main()
{
while(cin>>n>>m>>p)
{
for(int i=0; i<n; ++i)
cin>>s[i].a>>s[i].b;
sort(s,s+n,cmp);
int ans=0;
while(!q.empty())
q.pop();
for(int i=0; i<m; i++)
{
while(s[ans].a<=p&&ans<n)
{
q.push(s[ans]);
ans++;
}
if(!q.empty())
{
p+=q.top().b;
q.pop();
}
}
cout<<p<<endl;
}
return 0;
}