软件工程实习【传智杯】

[传智杯 #2 初赛] 软件工程实习

题目描述

某大学的《软件工程》必修课分为理论和实践部分。理论部分由该校教授完成授课;而实践部分是由第三方的公司主导,需要同学们在五周时间内自学 HTML、css、JavaScript、vue、Python、django 等技术,并组队完成一个真实的互联网商业应用。

参与这个课程的有 n ( 0 ≤ n ≤ 1000 ) n(0\le n \le 1000) n(0n1000) 个学生,分成了不超过 26 26 26 个队伍,每个队伍用 AZ 来表示。每个队伍都会完成一个项目,并以队伍为单位,给所有队伍(包括自己队伍)打分,范围是 0 0 0 100 100 100 的整数。

为了平息学生对这门课产生的出多问题的不满(比如工作量太大、时间过于紧张、考核方式不公平等),老师决定使用一种“看起来”很公平的方式来决定每组队伍的项目得分:

对于某个队伍,首先计算所有队伍(包括自己)给这个队伍评分的平均值,然后剔除掉和这个平均值差别超过 15 15 15 分的评分(保证不会出现所有的评分全部被剔除的情况),最后再对剩余的评分求平均值,四舍五入取整后作为这个队伍的项目得分。

对于每一个同学,我们已经得知他们的队伍代号和理论成绩(也是 0 0 0 100 100 100 分的整数)。这位同学的最后得分就是 60 % 60\% 60% 的理论成绩加上 40 % 40\% 40% 的所在队伍的项目得分,然后四舍五入取整。

现在老师想知道所有同学的分数排行。请按最后得分从高到低的顺序,输出每位同学的得分和他所在的队伍。

输入格式

第一行两个整数 n n n k k k,分别表示学生数和队伍数。

接下来 n n n 行,每行一个整数 s i s_i si 和一个大写字母 c i c_i ci,表示第 i i i 个选手的理论分数和队伍编号。保证队伍编号范围是从 A 开始后连续 k k k 个字母中的一个。

接下来 k k k 行,每行 k k k 个整数。其中第 i i i 行第 j j j 列的整数 a i , j a_{i,j} ai,j 表示第 i i i 个队伍给第 j j j 个队伍的评分,当 i = j i=j i=j 时,就是自评。

输出格式

输出 n n n 行表示答案,得分高的同学优先输出,得分相同时队伍编号较小的同学优先输出。对于每一行,先输出这位同学成绩,然后输出代表他的队伍编号的大写英文字母。

样例 #1

样例输入 #1

6 3
70 A
80 A
65 B
95 B
85 C
90 C
70 90 100
95 88 85
30 47 100

样例输出 #1

93 B
92 C
89 C
76 A
75 B
70 A

提示

A 组收到的分数分别是 70 , 95 , 30 70,95,30 70,95,30,其平均分为 65 65 65,则 95 , 30 95,30 95,30 被作为无效成绩剔除,因此 A 组的项目得分是 70 70 70 分。
B 组收到的分数分别是 90 , 88 , 47 90,88,47 90,88,47,其平均分为 75 75 75,则 47 47 47 被作为无效成绩剔除,因此 B 组的项目得分是 89 89 89 分。
C 组收到的分数分别是 100 , 85 , 100 100,85,100 100,85,100,其平均分为 95 95 95,没有打分被剔除,因此 C 组的项目得分是 95 95 95 分。

AC代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc=new Scanner(System.in);
        int n = sc.nextInt();//学生数
        int k = sc.nextInt();//队伍数
        int[][] arr=new int[n][2];//0->个人成绩,1->队伍编号
        for (int i = 0; i < n; i++) {
            arr[i][0]=sc.nextInt();
            arr[i][1]=sc.next().charAt(0)-'A';
        }
        double[][] v = new double[k][k];//队伍分数
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < k; j++) {
                v[i][j] = sc.nextDouble();
            }
        }
        double[] score=new double[k];//平均分
        for(int j=0;j<k;j++){
            for(int i=0;i<k;i++){
               score[j]+=v[i][j];
            }
            double avg=score[j]/k;
            int count=0;
            score[j]=0;
            for(int i=0;i<k;i++)
                if(Math.abs(v[i][j]-avg)<=15){
                    score[j]+=v[i][j];
                    count++;
                }
            score[j]=Math.round(score[j]/count);//最终平均分
        }
        for (int i = 0; i < n; i++) {
            arr[i][0] = (int) Math.round(arr[i][0] * 0.6 + score[arr[i][1]] * 0.4);
        }
        Arrays.sort(arr, (o1, o2) -> (o1[0]==o2[0])?(o1[1] - o2[1]):(o2[0] - o1[0]));
        for (int i = 0; i < n; i++) {
            System.out.println(arr[i][0] + " " + (char)(arr[i][1]+'A'));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄༊࿆水下月ོྂཾ࿆࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值