【每日一题】tokitsukaze and Soldier

tokitsukaze and Soldier

https://ac.nowcoder.com/acm/problem/50439

题意

每个士兵都有一个战力值和人数要求条件,选他组队就有满足他的条件,求队伍最大战力。

solution

一看就是老优先队列了。先按人数要求把每个士兵排个序,然后依次放入队列,因为每个士兵容纳人数是从大到小的,因此我们就只需要考虑是否满足当前士兵容纳人数就好了。优先队列按战力从小到大排序,保证每次删除的士兵战力是最小的,这样就可以满足整体最优,整个过程中维护最大值为答案即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,now,res;
struct Node
{
    ll v,s;
    friend bool operator <(Node a,Node b)
    {
         return a.v>b.v;
    }
}p[200005];

bool cmp(Node a,Node b)
{
    return a.s>b.s;
}

priority_queue<Node>q;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>p[i].v>>p[i].s;
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        q.push(p[i]);
        now+=p[i].v;
        while(!q.empty()&&q.size()>p[i].s)
        {
            now-=q.top().v;
            q.pop();
        }
        res=max(res,now);
    }
    cout<<res<<'\n';
    return 0;
}
全部评论

相关推荐

06-27 15:29
门头沟学院 Java
点赞 评论 收藏
分享
06-27 12:30
延安大学 C++
实习+外包,这两个公司底层融为一体了,如何评价呢?
一表renzha:之前面了一家外包的大模型,基本上都能答出来,那面试官感觉还没我懂,然后把我挂了,我都还没嫌弃他是外包,他把我挂了……
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务