贪心思想,每次选能承受队伍人数最多的那个人,如果队伍人数满了的话,排除掉能力值最低的那个,然后加入新的那个人,用一个变量存储这个过程中的最大值
#include <iostream> #include <algorithm> #include <queue> using namespace std; struct node { long long v; int s; }; const int maxn = 100010; node arr[maxn]; priority_queue<long long, vector<long long>,greater<long long>>q; bool cmp(node a, node b) { return a.s > b.s; } int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> arr[i].v >> arr[i].s; } sort(arr + 1, arr + n + 1, cmp); long long res = 0; long long ans = 0; for (int i = 1; i <= n; i++) { ans += arr[i].v; q.push(arr[i].v); while (q.size() > arr[i].s) { // cout << q.top() << " a"<<endl; ans -= q.top(); q.pop(); } res = max(res, ans); } cout << res; }