题目链接:https://ac.nowcoder.com/acm/problem/50439
题意:
在一个游戏中,在n个士兵中选出一些士兵组成一个团。
第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。
如果选了第i个士兵,这个士兵希望团的人数不超过s[i]。(如果不选第i个士兵,就没有这个限制。)
团的战力最大为多少。
思路:
由大到小枚举 k , 团的人数不超过 k , 能看出 k 只需要取是 s[i] 的值;
比 k 大的 s[i] 一定能符合人数不超过 k 的条件,所以在大于 k 的 s[i] 里选最大的 k 个, 不满 k 个就全选,用优先队列维护 v[i] 最大的 k 个士兵。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
pair<int, int> s[MAXN];
priority_queue<int, vector<int>, greater<int> > q;
long long ans = -1, sum = 0;
int main()
{
int n; cin >> n;
for (int i = 1; i <= n; ++i)
cin >> s[i].second >> s[i].first;
sort(s + 1, s + n + 1);
for (int i = n; i > 0; --i)
{
sum += s[i].second;
q.push(s[i].second);
while(q.size() > s[i].first)
{
sum-=q.top();
q.pop();
}
ans = max(sum, ans);
}
cout << ans << endl;
return 0;
}