题解 | #tokitsukaze and Soldier#

tokitsukaze and Soldier

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

考察知识点:贪心、优先队列

读入每个士兵的信息,按照士兵的 s[i] 值降序排序,然后依次将士兵战力加入优先队列(小根堆),同时维护当前士兵战力之和 cnt,当优先队列大小超过当前士兵的 s[i] 值时,将优先队列顶端的士兵战力(即最低战力)从 cnt 中减去,直到优先队列大小不超过当前士兵的 s[i] 值为止(由于已经进行了降序排序,所以当前的 s[i] 一定是已选择士兵中最低的 s 值),每次更新答案 ansmax(ans, cnt)

时间复杂度

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

void solve()
{
    int n;
    cin >> n;
    vpii vec(n);
    for (int i = 0; i < n; i++)
    {
        int v, s;
        cin >> v >> s;
        vec[i] = {s, v};
    }
    sort(vec.begin(), vec.end(), greater<pii>());
    priority_queue<int, vi, greater<int>> pq;  // 小根堆
    ll cnt = 0, ans = 0;
    for (int i = 0; i < n; i++)
    {
        int v = vec[i].second, s = vec[i].first;
        cnt += v;
        pq.push(v);
        while (pq.size() > s)
        {
            cnt -= pq.top();
            pq.pop();
        }
        ans = max(ans, cnt);
    }
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}
全部评论

相关推荐

03-06 17:17
门头沟学院 Java
程序员小白条:专升本提前注明,不然=白费,到最后面完,告诉你不能过,,还有这开源怎么前端大于后端....短链只写三个功能亮点的话,而且还是经典项目,反而可以不用,要么多写点东西,每个实习,项目都标准3点....
26届求职交流
点赞 评论 收藏
分享
03-04 07:14
门头沟学院 C++
黑皮白袜臭脚体育生:老板:都给工作机会了还想要工资,哪来这么多好事
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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