优先队列。
按a和b为关键字分别建立优先队列即可。
#include <cstdio> #include <cstring> #include <queue> using namespace std; struct node1 { int a, b; node1() {} node1(int _a, int _b): a(_a), b(_b) {} bool operator < (const node1 & x) const { return a > x.a; } }; struct node2 { int a, b; node2() {} node2(int _a, int _b): a(_a), b(_b) {} bool operator < (const node2 & x) const { return b < x.b; } }; int n, m, p; int main() { while (scanf("%d%d%d", &n, &m, &p) == 3) { priority_queue<node1> q1; priority_queue<node2> q2; int a, b; for (int i=0; i<n; i++) { scanf("%d%d", &a, &b); q1.push(node1(a, b)); } while (m--) { while (!q1.empty() && q1.top().a <= p) { q2.push(node2(q1.top().a, q1.top().b)); q1.pop(); } if (q2.empty()) break; p += q2.top().b; q2.pop(); } printf("%d\n", p); } return 0; }