原题链接:
https://ac.nowcoder.com/acm/problem/50439
题目大意:
有个士兵,每个士兵的战力为
,选取若干个士兵使组成战力最大的队伍,且满足队伍中的人数小于等于队伍中士兵的
最小值。
解题思路:
将士兵按由大到小排序放入数组,然后建立一个优先队列存放战力,使低战力优先,然后遍历数组,每次遍历将
放入优先队列,同时判断此时队列的元素个数与
的大小,当队列元素个数大于bi时删去队列首元素,直到队列元素小于等于
。然后过程中取最大值。(由大到小遍历可以使队列中删除的元素不再使用)
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,a,b) for(i=a;i<=b;i++) #define debug(a) cout<<#a<<":"<<a<<endl; const ll INF=1e9+7; const ll N=1e6+7; const ll mod=1e9+7; ll maxn,minn; ll T,n; struct aa{ ll a,b; bool operator < (const aa &x) const{ return b>x.b; } }arr[N]; priority_queue<ll,vector<ll>,greater<ll> >que; int main(){ ll ans=0; ll k; cin>>n; for(ll i=1;i<=n;i++){ scanf("%lld%lld",&arr[i].a,&arr[i].b); } sort(arr+1,arr+n+1); maxn=0; for(ll i=1;i<=n;i++){ ans+=arr[i].a; que.push(arr[i].a); while(que.size()>arr[i].b){ ans-=que.top(); que.pop(); } maxn=max(ans,maxn); } cout<<maxn<<endl; return 0; }