题意
每个士兵都有一个战力值和人数要求条件,选他组队就有满足他的条件,求队伍最大战力。
solution
一看就是老优先队列了。先按人数要求把每个士兵排个序,然后依次放入队列,因为每个士兵容纳人数是从大到小的,因此我们就只需要考虑是否满足当前士兵容纳人数就好了。优先队列按战力从小到大排序,保证每次删除的士兵战力是最小的,这样就可以满足整体最优,整个过程中维护最大值为答案即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,now,res;
struct Node
{
ll v,s;
friend bool operator <(Node a,Node b)
{
return a.v>b.v;
}
}p[200005];
bool cmp(Node a,Node b)
{
return a.s>b.s;
}
priority_queue<Node>q;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i].v>>p[i].s;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
{
q.push(p[i]);
now+=p[i].v;
while(!q.empty()&&q.size()>p[i].s)
{
now-=q.top().v;
q.pop();
}
res=max(res,now);
}
cout<<res<<'\n';
return 0;
}
京公网安备 11010502036488号