思路
这题对于每个士兵多了一个si的限制,也就是对要选择的人数有了限制,如果没有这个限制的话,我们肯定是直接按照武力值从大到小去选取,有了这个限制就不行了
考虑把si从大到小排序
这样的话 对于si就是不升序的排列,那么我们能选取的个数就是取决于已经选择的人的si限制了
所以对于每个vi我们先加进去到要选择的集合内,然后看集合的个数是不是>si 是的话就把武力值小的从集合里拉出来
所以需要的是一个支持加入删除 和自动排序的数据结构 自然就是一个维护小顶堆的优先队列了
注意数据运算可能会炸int

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<int>> q;
struct node
{
    ll v,s;
}a[100005];
int main(){

    ios::sync_with_stdio(0);
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i].v>>a[i].s;
    sort(a+1,a+1+n,[](node a,node b){

       return a.s>b.s; 
    });
    ll sum=0,ans=0;
    for(int i=1;i<=n;i++){
        q.push(a[i].v);
        sum+=a[i].v;
        while(q.size()>a[i].s){
            sum-=q.top();
            q.pop();
        }
        ans=max(ans,sum);
    }
    cout<<ans;

    return 0;
}