题意
每个士兵都有一个战力值和人数要求条件,选他组队就有满足他的条件,求队伍最大战力。
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; }