题意
有个士兵,每个士兵都有一个战力值,和一个值,要求团队人数不超过,问可以组成的最大战力是多少。
分析
贪心,先按照对士兵排序,然后对于每个士兵,在他之前的士兵的值都比他大,所以我们可以求出当这个士兵的是士兵规模值时所能组成的战力和(贪心的减去前面武力最小的值)。
我们可以利用优先队列或者维护。
#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; }