23-C2-7-1 世界杯

7-1 世界杯

3014 年世界杯足球赛就要开始了!作为卫冕冠军中国足球队的教练,手下每位球员都是猛将,如何摆出最强的 11 人阵容也是一件幸福的烦恼事啊。
众所周知,足球阵容里的11个球员都会被分配到场上某一个特别的位置,而这些位置主要分为守门员、后卫、中场和前锋四种,其中守门员有且只有一个,后卫、中场和前锋的人数取决于你安排的足球阵型。形容足球阵型的方法由后卫开始计算至前锋,但不把守门员计算在内。例如,3-5-2 阵型是指有三个后卫、五个中场及两名前锋。由于竞争激烈,每位球员只会培养其中一种位置所需要的技能,所以他们每个人都只能胜任四个位置中的其中一种。
作为一个对球员能力了如指掌的教练,你给每个球员的综合水平进行量化。为了将阵型安排得更好,你的教练团队决定使用以下策略安排球员:首先按照顺序提出 Q 个阵型,分别代表第一阵型、第二阵型、……、第 Q 阵型。然后对于每个阵型,从仍未选择的球员中选择最好的对应数量的守门员、后卫、中场和前锋。比如说,对于第一阵型,在所有球员中选择;对于第二阵型,在除了第一阵型外的所有球员中选择;对于第三阵型,在除了第一阵型和第二阵型外的所有球员中选择;以此类推。
现在 Q 个阵型都已经确定,而你需要知道的,是每个阵型的平均综合水平分别是多少。

输入格式

第一行有四个整数 K,D,M,F,分别表示守门员、后卫、中场和前锋供挑选的球员人数。
第二行有 K 个整数 ki​,分别表示每个守门员的综合水平值。
第三行有 D 个整数 di​,分别表示每个后卫的综合水平值。
第四行有 M 个整数 mi​,分别表示每个中场的综合水平值。
第五行有 F 个整数 fi​,分别表示每个前锋的综合水平值。
第六行有一个整数 Q,表示教练团队提出的阵型个数。
以下 Q 行,第 i 行三个整数 Ai​,Bi​,Ci​,由空格间隔,表示第 i 阵型是 Ai​−Bi​−Ci​ 阵型。

输出格式

输出 Q 行。对于第 i 种阵型,输出一个实数,表示该阵型平均综合水平的最大值,并四舍五入到小数点后 2 位。

样例输入 #1

3 10 12 4
76 60 87
78 84 84 84 81 82 72 51 77 57
85 84 62 87 88 64 81 90 80 66 88 85
65 83 63 79
2
4 5 1
4 4 2

样例输出 #1

85.64
78.00

提示

对于 30% 数据,K,D,M,F≤1000,Q≤10;
对于 100% 数据,1≤K,D,M,F≤105,0≤ki​,di​,mi​,fi​≤108,1≤Q≤K,0≤Ai​,Bi​,Ci​≤10,Ai​+Bi​+Ci​=10,∑Ai​≤D,∑Bi​≤M,∑Ci​≤F

参考答案

#include <iostream>
#include <vector>
#include <queue>
#include <functional> // For greater, to create a max heap
#include <iomanip>    // For setting precision of the output

int main() {
    int K, D, M, F; // K, D, M, F 分别表示守门员、后卫、中场和前锋的人数
    std::cin >> K >> D >> M >> F;

    std::priority_queue<int> goalkeepers; // 守门员的优先队列(最大堆)
    std::priority_queue<int> defenders;   // 后卫的优先队列(最大堆)
    std::priority_queue<int> midfielders; // 中场的优先队列(最大堆)
    std::priority_queue<int> forwards;    // 前锋的优先队列(最大堆)

    int skill;
    for (int i = 0; i < K; ++i) {
        std::cin >> skill;
        goalkeepers.push(skill);
    }
    for (int i = 0; i < D; ++i) {
        std::cin >> skill;
        defenders.push(skill);
    }
    for (int i = 0; i < M; ++i) {
        std::cin >> skill;
        midfielders.push(skill);
    }
    for (int i = 0; i < F; ++i) {
        std::cin >> skill;
        forwards.push(skill);
    }

    int Q; // 阵型个数
    std::cin >> Q;
    int A, B, C;

    // 设置输出格式,固定小数点后两位
    std::cout << std::fixed << std::setprecision(2);

    for (int i = 0; i < Q; ++i) {
        std::cin >> A >> B >> C;
        double total_score = 0;
        int count = 1; // 包含一个守门员

        // 选守门员
        total_score += goalkeepers.top();
        goalkeepers.pop();

        // 选后卫
        for (int j = 0; j < A; ++j) {
            total_score += defenders.top();
            defenders.pop();
        }

        // 选中场
        for (int j = 0; j < B; ++j) {
            total_score += midfielders.top();
            midfielders.pop();
        }

        // 选前锋
        for (int j = 0; j < C; ++j) {
            total_score += forwards.top();
            forwards.pop();
        }

        // 计算平均分
        double average_score = total_score / (A + B + C + 1); // 总人数为 A + B + C + 1(守门员)
        std::cout << average_score << std::endl;
    }

    return 0;
}
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值