原题链接:
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;
} 
京公网安备 11010502036488号