P3887 [GDOI2014]世界杯

题目描述

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 阵型是 AiBiCi 阵型。

输出格式

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

输入输出样例

输入 #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
题解
首先按要求输入守门员、后卫、中场和前锋供挑选的球员人数。再依次输入各球员的综合水平值。接着输入阵型的个数和阵型。
接着根据各球员的水平将他们从高到低排序。
用while循环来完成q个队形的选择和水平值计算。
首先选择排名最高的守门员,此时守门员的计数aa要加一(下一个队形就要选择下一个守门员),接着根据队形的人数需要,从各类球员的第一个人开始选择,选择完毕后进行不同位置的计数的加,选了几个人加几。在选人的同时将被选中的人的水平值加起来,最后求出他们的平均水平值并进行输出。用while循环来完成q个队形的选择和水平值计算。

代码
#include <bits/stdc++.h>

using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int k,d,m,f,q,i;
    cin>>k>>d>>m>>f;
    int a[k+1],b[d+1],c[m+1],e[f+1];
    double rr=0;
    for(i=1;i<=k;i++)
    {
        cin>>a[i];
    }
    for(i=1;i<=d;i++)
    {
        cin>>b[i];
    }
    for(i=1;i<=m;i++)
    {
        cin>>c[i];
    }
    for(i=1;i<=f;i++)
    {
        cin>>e[i];
    }
    sort(a+1,a+k+1,cmp);
    sort(b+1,b+d+1,cmp);
    sort(c+1,c+m+1,cmp);
    sort(e+1,e+f+1,cmp);
    cin>>q;
    int x,y,z;
    int aa=1,bb=1,cc=1,ee=1;
    while(q--)
    {
        cin>>x>>y>>z;
        rr=rr+a[aa];
        aa++;
        for(i=bb;i<bb+x;i++)
        {
            rr=rr+b[i];
        }
        bb=bb+x;
        for(i=cc;i<cc+y;i++)
        {
            rr=rr+c[i];
        }
        cc=cc+y;
        for(i=ee;i<ee+z;i++)
        {
            rr=rr+e[i];
        }
        ee=ee+z;
        printf("%.2lf\n",rr/11);
        rr=0;
    }
    return 0;
}

 


posted @ 2023-04-20 22:02  Dachi7  阅读(80)  评论(0)    收藏  举报