1 条题解

  • 1
    @ 2024-4-26 18:42:40

    使用优先队列维护所有位置的球员,对于每个阵型,到优先队列里面取出对应的球员,并求平均值即可。具体细节见代码注释。

    参考代码
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    priority_queue<int> K,  D,  M,  F;
    int k, d, m, f, q, a;
    int Q[100010];
    int sd, sm, sf;//依次代表阵型每个位置的人的个数
    int sK, sD, sM, sF;//每个阵的位置的总实力
    int main()
    {
        //读入并放进优先队列里
        scanf("%d%d%d%d", &k, &d, &m, &f);
        for (int i = 1; i <= k; i++)
        {
            scanf("%d", &a);
            K.push(a);
        }
        for (int i = 1; i <= d; i++)
        {
            scanf("%d", &a);
            D.push(a);
        }
        for (int i = 1; i <= m; i++)
        {
            scanf("%d", &a);
            M.push(a);
        }
        for (int i = 1; i <= f; i++)
        {
            scanf("%d", &a);
            F.push(a);
        }
        scanf("%d", &q);
        for (int i = 1; i <= q; i++)
        {
            scanf("%d%d%d", &sd, &sm, &sf);
            sK = K.top();
            K.pop();//取出并删除现存的实力最大的守门员
            for (int j = 1; j <= sd; j++)
            {
                sD += D.top();
                D.pop();
            }
            for (int j = 1; j <= sm; j++)
            {
                sM += M.top();
                M.pop();
            }
            for (int j = 1; j <= sf; j++)
            {
                sF += F.top();
                F.pop();
            }
            //依次取出并删除其余位置现存的最大实力球员
            printf("%.2f\n", (double)(sF + sM + sD + sK) / 11.0);
            //输出并清零
            sK = sM = sD = sF = 0;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    723
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    (无)
    递交数
    32
    已通过
    26
    上传者