图片说明
图片说明
题意:给你N个士兵。每个人的武力值为v,可组队人数为S,求怎么组队武力值最大。
思路:从组队人数N-1开始,每次吧组队人数>=N的人的武力值加入,并用小顶堆维护人数的同时保证武力值最大。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <ctype.h>
#include <cstring>
#include <cstdio>
#include <set>
#include <sstream>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define MAXX 100005
#define SIS std::ios::sync_with_stdio(false)
#define ll long long
#define INF 0x3f3f3f3f
//#include<bits/stdc++.h>
using namespace std;

const int MAX =1e6+5;
const int mod=998244353;
vector<ll> vt[100005];
priority_queue<ll,vector<ll>,greater<ll> >q;
int main()
{
    SIS;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int v,s;
        cin>>v>>s;
        vt[s].push_back(v);
    }
    ll ans=0,sum=0;
    for(int i=n;i>=1;i--)
    {
        for(auto u:vt[i]){
            sum+=u;
            q.push(u);
        }
        while(q.size()>i)
        {
            sum-=q.top();
            q.pop();
        }
        ans=max(sum,ans);
    }
    cout<<ans<<endl;

    return 0;
}