比赛
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) + ",");
}
}
}
}