这是一个贪心题
按容纳人数排序 当新加入的人的容纳人数小于总人时 去除人数差个战力最小的人
每次加入人都会记录一下最大值
最后就求出了军团战力的最大值
#include <bits/stdc++.h> #define ll long long ll const N=1e5+5; using namespace std; ll n,v[N],s[N]; priority_queue<ll, vector<ll>, greater<ll> > q; struct T{ int v,s; }k[N]; bool cmp(T a,T b){ return a.s>b.s; }; int main() { scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d%d",&k[i].v,&k[i].s); sort(k+1,k+1+n,cmp); ll z=0,ans=0; for(int i=1;i<=n;++i) { z+=k[i].v; q.push(k[i].v); while(q.size()>k[i].s) { z-=q.top(); q.pop(); } ans=max(ans,z); } cout<<ans<<endl; return 0; }