1392 字
5 分钟阅读
赛博空间挑战赛 / PTA

题目描述:

中科附高计划派一支 m 人的队伍参加赛博空间挑战赛,已知中科附高共有学生 n 人,在该比赛所涉及内容的能力值分别为 a_{1}​, a_{2}​……a_{n} ( 0 < a_{i} ​< k )

由于是第一次参赛,带队的郝老师只能假设队伍的能力值为个人能力值之和。而且由于主场比赛想获得好成绩,郝老师计划派出能力值最强的队伍参赛,现在他想知道所派出的队伍的能力值是多少。

输入格式:

输入数据共两行。

第一行有三个自然数 n,m,k

第二行有 n 个自然数,分别是 a_{1}​, a_{2}​……a_{n} ​​。

输入数据以空格分隔,各变量含义如题面所述,其中 m \le n

输出格式:

输出一个整数,为所派队伍的能力值。输入数据保证该值不超过 2\times 10^9

输入样例:

5 2 4
2 3 1 0 3

输出样例:

6

数据范围:

测试点编号 n m k
0-2 \le10^3 \le n \le 10^4
3-4 10^4 100 \le 10^5
5-6 \le 2 \times 10^7 \le 500 \le 3 \times 10^6
7-9 \le 5 \times 10^6 \le n \le 10^9

思路:

题意是对序列内最大的 m 个数求和,但是使用数组+快排会MLE。所以考虑使用堆来动态维护数组内的前 m 大的数。C++要关闭流同步,不然读入数据就会TLE。

我的AC代码:

#include <bits/stdc++.h>
#define all(a) (a).begin(),(a).end()
using namespace std;

using uint = unsigned int;
using ll = long long;
using ull = unsigned long long;

void solve(){
    uint n,m,k;
    cin >> n >> m >> k;
    priority_queue<uint,vector<uint>,greater<uint>> pq;
    for(int i = 0;i < n;i++){
        uint x;
        cin >> x;
        pq.push(x);
        if(pq.size() > m) pq.pop();
    }
    uint ans = 0;
    while(!pq.empty()){
        ans += pq.top();
        pq.pop();
    }
    cout << ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注