比赛

2025-11-03  本文已影响0人  何以解君愁

 一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。
 打分规则为每个评委对选手打分,最高分10分,最低分1分。
 请计算得分最多的3位选手的编号。
 如果得分相同,则得分高分值最多的选手排名靠前
 (10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。
 输入描述:第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。
 输出描述:选手前3名的编号。
 注:若输入为异常,输出-1,如M、N、打分不在范围内。

import java.util.*;


public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] temp = sc.nextLine().split("[,]");
        //m个评委,n个选手
        int m = Integer.parseInt(temp[0]);
        int n = Integer.parseInt(temp[1]);
        
        //接收选手
        //+2,嵌入选手id以及总成绩,m个评委,n个选手
        //n个选择,int[][] id 总分 单项成绩(m个评委)
        int[][] mn = new int[n][m + 2];
        int[] sums = new int[n];
        for(int i = 0;i < m;i++){
            //,切割获取结果
            //第一个人的第一个成绩,第二个人的第一个......
            //n行
            String sm = sc.nextLine();
            if(sm.isEmpty()||m < 3||n < 3){
                System.out.print("-1");
                return;
            }
            String[] s = sm.split("[,]");
            for(int j = 0;j < n;j++){
                if(Integer.parseInt(s[j]) > 10||Integer.parseInt(s[j]) < 0){
                    System.out.print("-1");
                    return;
                }
                //接收第几个参数
                mn[j][i + 2] = Integer.parseInt(s[j]);
                //0 1 2
                sums[j] += Integer.parseInt(s[j]);
            } 
        }

        for(int i = 0;i <sums.length;i++){
            mn[i][0] = i;
            mn[i][1] = sums[i]; 
//             System.out.print(mn[i][0] + " ");
//             System.out.print(mn[i][1] + " ");
//             System.out.print(mn[i][2] + " ");
        }
        
        Arrays.sort(mn, (a, b) -> {
            if (a[1] != b[1]) {
                return b[1] - a[1]; // 首先按总分降序
            } else {
                // 从最高分开始逐级比较
                for (int scoreLevel = 10; scoreLevel >= 0; scoreLevel--) {
                    int countA = 0;
                    int countB = 0;
            
                    // 统计当前分数级别出现的次数
                    for (int i = 2; i < m + 2; i++) {
                        if (a[i] == scoreLevel) countA++;
                        if (b[i] == scoreLevel) countB++;
                    }
            
                    // 如果当前级别分数出现次数不同,按次数降序
                    if (countA != countB) {
                        return countB - countA;
                    }
                }
        
                return a[0] - b[0];
            }
        });
        for(int i = 0;i < 3;i++){
            if(i == 2){
                System.out.print(mn[i][0] + 1);
            }else{
                System.out.print((mn[i][0] + 1) + ",");
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读