• tokitsukaze and Soldier-牛客每日一题


    题目链接:https://ac.nowcoder.com/acm/problem/50439

    题意:

    在一个游戏中,在n个士兵中选出一些士兵组成一个团。

    第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。

    如果选了第i个士兵,这个士兵希望团的人数不超过s[i]。(如果不选第i个士兵,就没有这个限制。)

    团的战力最大为多少。

    思路:

    由大到小枚举 k , 团的人数不超过 k , 能看出 k 只需要取是 s[i] 的值;

    比 k 大的 s[i] 一定能符合人数不超过 k 的条件,所以在大于 k 的 s[i] 里选最大的 k 个, 不满 k 个就全选,用优先队列维护 v[i] 最大的 k 个士兵。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 100005;
    pair<int, int> s[MAXN];
    priority_queue<int, vector<int>, greater<int> > q;
    long long ans = -1, sum = 0;
    int main()
    {
        int n; cin >> n;
        for (int i = 1; i <= n; ++i)
            cin >> s[i].second >> s[i].first;
        sort(s + 1, s + n + 1);
        for (int i = n; i > 0; --i)
        {
            sum += s[i].second;
            q.push(s[i].second);
            while(q.size() > s[i].first)
            {
                sum-=q.top();
                q.pop();
            }
            ans = max(sum, ans);
        }
        cout << ans << endl;
        return 0;
    }
    
  • 相关阅读:
    从温设计模式
    php pdf转图片
    PHP 微服务集群搭建
    死磕nginx系列--nginx 限流配置
    分别
    一生悲哀
    三十男人的思考
    test markdown
    linux 系统内核空间与用户空间通信的实现与分析<转>
    ue4 SNew补遗
  • 原文地址:https://www.cnblogs.com/Dont-Starve/p/13199736.html
Copyright © 2020-2023  润新知