C++中有优先队列的模版。
于是用了一下,对a排了个序,Ac了。
代码如下:
#include <stdio.h>
#include <queue>
#include <stdlib.h>
#include <algorithm>
using namespace std;
struct s
{
int a;
int b;
}pr[100005];
int cmp1(struct s a,struct s b)
{
return a.a < b.a;
}
int main()
{
int n,m,i,j,k,p;
while(scanf("%d%d%d",&n,&m,&p) != EOF)
{
for(i = 0;i < n;i++)
scanf("%d%d",&pr[i].a,&pr[i].b);
sort(pr,pr+n,cmp1);
priority_queue <int> q;
q.push(0);
i = 0;
while(m--)
{
for(;i < n;i++)
if(pr[i].a <= p)
q.push(pr[i].b);
else
break;
if(q.empty()) break;
p += q.top();
q.pop();
}
while(!q.empty()) q.pop();
printf("%d/n",p);
}
return 0;
}
最后判断队列为空的那一句非常重要。如果没写的话会超内存。
系统默认是最大堆,如果要实现最小堆,应该如下写:
struct cmp1{
bool operator ()(const int &i,const int &j){
return j>i; //最小堆只要把i>j;
}
};
priority_queue < int, vector < int >, cmp1 > q;
post by: Kiswell