简单的思路
这是一个贪心题;
按容纳人数排序 当新加入的人的容纳人数小于总人时 去除人数差个战力最小的人;
每次加入人都会记录一下最大值;
最后就求出了军团战力的最大值;
本质是枚举满足每个人人数要求的军团战力最大值。


以下是错误思路:
看得出是贪心首先是按照人数要求,从大到小排序,从人数要求最宽容的开始选,然后我翻了错误,每次遇到不满足新人的人数要求时,我用超出的人数的战力和当前枚举到的人的战力比较,选择强的入队,这显然是错误的。
自己举的反例:
输入:
5
3 7
4 6
5 5
6 2
10 2
输出:
16
贪心需要一定的证明来保证自己是正确的,做这道题时我显然没有做到。
以下是ac代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;

struct vs
{
int v, s;
} a[N];
priority_queue<long long, vector<long long="">, greater<long long="">> q;
bool cmp(vs x, vs y)
{
return x.s > y.s;
}
int v[N], s[N], b[N]; //b //小顶堆
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].v >> a[i].s;
}
sort(a, a + n, cmp);</long></long>

q.push(a[0].v);
long long maxx = a[0].v, sum = a[0].v;
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();
    }
    maxx=max(sum,maxx);
}
cout << maxx << "\n";
return 0;

}