传送门:tokitsukaze and Soldier
题意:从n个士兵挑选出一个战斗值最大的团队,每个士兵有两个属性v和s,v代表战斗力,s代表所在团队的人数不可以大于s。求最大的战斗值。
做法:对所有士兵按照s升序排序,每次将一个士兵作为必须加入的士兵,将已加入的士兵放入优先按v降序的队列中,当pq.size()>当前士兵的s,就从队列中弹出now-top().v,记录一下最大的now。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
struct ac{
int v,s;
bool operator <(const ac& a)const {
return v>a.v;
}
}a[maxn];
bool cmp(ac a1,ac a2){
if(a1.s==a2.s) return a1.v>a2.v;
return a1.s>a2.s;
}
priority_queue<ac> pq;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d",&a[i].v,&a[i].s);
}
sort(a+1,a+1+n,cmp);
long long now=0,ans=0;
int i=0;
a[0].s=n+10;
for(int i=1;i<=n;++i){
now+=a[i].v;
while(pq.size()>0&&pq.size()+1>a[i].s){
now-=pq.top().v;
pq.pop();
}
pq.push(a[i]);
ans=max(ans,now);
}
cout<<ans<<endl;
return 0;
}