思路:
这题对于每个士兵多了一个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;
}
京公网安备 11010502036488号