一个有n个选手的比赛,选手编号为(3<=n<=100),有m(3<=m<=10)个评委对选手进行打分。打分规则则为,评委给最高分10,最低分1。
请计算得分最多的3位选手的编号,如果得分相同,则得高分值的个数最多的靠前(得10分数量相同,则比较得9分数量,以此类推,用例中不会出现多个选手得分完全相同的情况)
写出伪代码
public class 类名 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 获取选手 n 和评委 m 的个数
类型 n = Integer.parseInt(input.next());
类型 m = Integer.parseInt(input.next());
// 存储前3选手被每个评委的评分,第4个当成最后一名选手,来对比排序
类型[][] narray = new 类型[4][12];
// 因为评委要给选手评分,所以我们要遍历选手并给评分
// 0 选手编号
// 1 - 10 分数数量
// 11 选手
for (int i = 0; i < n; i++) {//遍历选手
// 评委评分
// 把第四选手的评分清空
for (int j = 0; j < 12; j++) {
narray[3][j] = 0;
}
// 评委评分
for (int j = 0; j < m; j++) {
类型 临时存储 = Integer.valueOf(input.next());
// 记录总分数
narray[3][11] += 临时存储;
// 记录选手的相同分数的个数
narray[3][临时存储]++;
}
// 保存选手
narray[3][0] = i + 1;
// 每次评分后就进行,选手排名
sort(narray);
}
for (int i = 0; i < 3; i++) {//遍历前三的选手
System.out.println(narray[i][0]);
}
}
// 进行排序,选择出前三的选手
public static void sort(类型[][] narray) {
/*
有两种可能
1.当前选手分数大于前三
2.当前选手分数等于前三
*/
// 循环排序前四名
for (int j = 0; j < 3; j++) {
/*
当前选手分数大于前三时,有两种可能
1.比赛刚刚开始,前三还没有出来
2.前三已经出来了,就要进行排序 */
if (narray[j][11] < narray[3][11]) {
// 当前选手的总分大于 前三的,进行排名对换f
类型 临时替换= narray[3][0];
narray[3][0] = narray[j][0];
narray[j][0] = 临时替换;
// 并换取总分和分数个数
for (int l = 11; l > 0; l--) {
临时替换= narray[3][l];
narray[3][l] = narray[j][l];
narray[j][l] = 临时替换;
}
// 前三还没有出来,所以进行退出,不必进行比下去了
if (narray[3][0] == 0) break;
} else if (narray[j][11] == narray[3][11]) {//2.当前选手分数等于前三
for (int k = 10; k > 0; k--) {
/*选手的总分数等于前三的选手,有三种可能
1. 选手的最大分数多于前三
2. 选手的等于前三的
3. 选手的最大分数少于前三的
*/
if (narray[j][k] < narray[3][k]) {//选手的最大分数多于前三
类型 临时替换= narray[3][0];
narray[3][0] = narray[j][0];
narray[j][0] = 临时替换;
for (int l = k; l > 0; l--) {
临时替换= narray[3][l];
narray[3][l] = narray[j][l];
narray[j][l] = 临时替换;
}
break;
} else if (narray[j][k] > narray[3][k]) {//选手的最大分数少于前三的
break;
}
}
}
}
}
}
。
思路:
1.定义一个选手类,里面包含选手姓名,选手得分,及评委打分数组,数组大小为评委人数;
2.定义选手类数组,或list集合,把选手得分放到数组里面;
3.对数组进行排序,输出结果。