题解 | #tokitsukaze and Soldier#
tokitsukaze and Soldier
https://ac.nowcoder.com/acm/problem/50439
贪心,对于【s】从大到小处理,对当前不满足【s】要求的按价值最小出队,则队列中元素为已处理过的元素在【s】下的最优要求。
#include<algorithm>
#include<cmath>
#include<numeric>
#include<vector>
#include<iomanip>
#include<queue>
typedef long long ll;
const double eps = 1e-4;
using namespace std;
ll n;
vector<int> sor[100005];
priority_queue<int,vector<int>,greater<int>> q;//优先队列价值升序
int main()
{
int n = 0; cin >> n;
int s, v;
for (int i = 1; i <= n; i++)
{
cin >> v >> s;
sor[s].push_back(v);
}
int sum = 0; int ans = 0;
for (int i = n; i >= 1; i--)
{
for (auto a : sor[i])
{
sum += a;
q.push(a);
}
while (q.size() > i)
{
sum -= q.top();
q.pop();
}
ans = max(ans, sum);
}
cout << ans << endl;
return 0;
}