tokitsukaze and Soldier-模拟

传送门: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;
}
发布了96 篇原创文章 · 获赞 11 · 访问量 2258

猜你喜欢

转载自blog.csdn.net/weixin_43769146/article/details/104059669