题意

  • 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;
}