原题链接:

https://ac.nowcoder.com/acm/problem/50439

题目大意:

个士兵,每个士兵的战力为,选取若干个士兵使组成战力最大的队伍,且满足队伍中的人数小于等于队伍中士兵的最小值。

解题思路:

将士兵按由大到小排序放入数组,然后建立一个优先队列存放战力,使低战力优先,然后遍历数组,每次遍历将放入优先队列,同时判断此时队列的元素个数与的大小,当队列元素个数大于bi时删去队列首元素,直到队列元素小于等于。然后过程中取最大值。(由大到小遍历可以使队列中删除的元素不再使用)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(i=a;i<=b;i++)
#define debug(a) cout<<#a<<":"<<a<<endl;
const ll INF=1e9+7;
const ll N=1e6+7;
const ll mod=1e9+7;
ll maxn,minn;
ll T,n;
struct aa{
    ll a,b;
    bool operator < (const aa &x) const{
        return b>x.b;
    }
}arr[N];
priority_queue<ll,vector<ll>,greater<ll> >que;

int main(){
    ll ans=0;
    ll k;
    cin>>n;
    for(ll i=1;i<=n;i++){
        scanf("%lld%lld",&arr[i].a,&arr[i].b);
    }
    sort(arr+1,arr+n+1);
    maxn=0;
    for(ll i=1;i<=n;i++){
        ans+=arr[i].a;
        que.push(arr[i].a);
        while(que.size()>arr[i].b){
            ans-=que.top();
            que.pop();
        }
        maxn=max(ans,maxn);
    }
    cout<<maxn<<endl;

    return 0;
}