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