题意
- n名士兵,每个士兵有v,s,两个值,代表战斗力和包含改名士兵后队伍最大容量,求战斗力最高为多少
思路
- 贪心
- 在人数固定的时候贪心选战斗力最高的人
- 从最大人数开始向下枚举,所有能放的都放进小顶堆,然后超出的就弹出,过程中记录最大答案
代码
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int v,s;
}S;
bool cmp1(S a,S b){
return a.s>b.s;
}
S sodi[202020];
priority_queue<int,vector<int>,greater<int>> a;
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&sodi[i].v,&sodi[i].s);
sort(sodi,sodi+n,cmp1);
int cnt=0;
long long ans=0,mx=0;
for(int i=sodi[0].s;i>=sodi[n-1].s;i--){
while(sodi[cnt].s>=i&&cnt<n){
a.push(sodi[cnt].v);
ans+=sodi[cnt].v;
cnt++;
}
while(a.size()>i){
ans-=a.top();
a.pop();
}
mx=max(mx,ans);
}
printf("%lld",mx);
return 0;
}