题意

个士兵,每个士兵都有一个战力值,和一个值,要求团队人数不超过,问可以组成的最大战力是多少。

分析

贪心,先按照对士兵排序,然后对于每个士兵,在他之前的士兵的值都比他大,所以我们可以求出当这个士兵的是士兵规模值时所能组成的战力和(贪心的减去前面武力最小的值)。
我们可以利用优先队列或者维护。

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;
int n,m,k,ok;

struct node
{
    int v,s;
}a[maxn];

bool cmp(node x,node y)
{
    return x.s > y.s;
}

signed main()
{
    cin>>n;
    for(int i = 1; i <= n; i++) 
    {
        cin>>a[i].v>>a[i].s;
    }
    sort(a+1,a+1+n,cmp);
    priority_queue<int, vector<int>, greater<int> > q;
    int ans = 0,res = 0;
    for(int i = 1; i <= n; i++) 
    {
        q.push(a[i].v);
        res += a[i].v;
        while(q.size() > a[i].s)
        {
            res -= q.top();
            q.pop();
        }
        ans = max(ans,res);
    }
    cout<<ans<<endl;
    return 0;
}