题目链接
一组学生成绩,每个学生分别有c语言、数学、英语三门课的成绩以及三门课的平均成绩,每门课都一个相应排名,现在需要知道指定学生的四门成绩中排名最靠前的一门成绩及相应的排名,优先级按照平均成绩> c > 数学 > 英语
注:输入需要使用StreamTokenizer;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.*; class Student{ public int number; // 学号 public int[] grade; // 分数数组 public int[] rank; // 排名数组 public int best; // 最佳排名 } public class Main { static int flag = 0; // 分数数组排序列的索引,如flag = 0是对平均分进行排序 public static void main(String[] args) throws IOException { StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); sc.nextToken(); int n = (int)sc.nval; sc.nextToken(); int m = (int)sc.nval; Student[] data = new Student[n]; int[] exist = new int[1000001]; // 映射数组,判断当前学号是否存在以及在Student数组中的位置 char[] subject = new char[]{'A', 'C', 'M', 'E'}; for (int i=0; i<n; ++i){ data[i] = new Student(); data[i].grade = new int[4]; data[i].rank = new int[4]; sc.nextToken(); data[i].number = (int)sc.nval; sc.nextToken(); data[i].grade[1] = (int)sc.nval; sc.nextToken(); data[i].grade[2] = (int)sc.nval; sc.nextToken(); data[i].grade[3] = (int)sc.nval; data[i].grade[0] = ( data[i].grade[1] + data[i].grade[2] + data[i].grade[3]) / 3; } for(int i=0; i<4; ++i){ flag = i; Arrays.sort(data, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o2.grade[flag] - o1.grade[flag] ; } }); // 平均分或学科分数的排名情况 data[0].rank[flag] = 1; for (int j = 1; j < n; j++) { if(data[j].grade[flag] == data[j-1].grade[flag]){ data[j].rank[flag] = data[j-1].rank[flag]; }else{ data[j].rank[flag] = j + 1; } } } // 获取每个人最优的排名情况 for (int i = 0; i < n; i++) { int k = 0; int min = data[i].rank[0]; exist[data[i].number] = i + 1; for (int j = 1; j < 4; j++) { if(min > data[i].rank[j]){ min = data[i].rank[j]; k = j; } } data[i].best = k; } for (int i = 0; i < m; i++) { sc.nextToken(); int id = (int)sc.nval; flag = exist[id]; if(flag > 0){ System.out.println(data[flag-1].rank[data[flag-1].best] + " " + subject[data[flag-1].best]); }else{ System.out.println("N/A"); } } } }