每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入第一行给出一个正整数 N(≤10 5 ),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息:
准考证号 得分 学校 其中准考证号是由 6 个字符组成的字符串,其首字母表示考试的级别:B代表乙级,A代表甲级,T代表顶级;得分是 [0, 100] 区间内的整数;学校是由不超过 6 个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:
排名 学校 加权总分 考生人数 其中排名是该单位的排名(从 1 开始);学校是全部按小写字母输出的单位码;加权总分定义为乙级总分/1.5 + 甲级总分 + 顶级总分*1.5的整数部分;考生人数是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。
10 A57908 85 Au B57908 54 LanX A37487 60 au T28374 67 CMU T32486 24 hypu A66734 92 cmu B76378 71 AU A47780 45 lanx A72809 100 pku A03274 45 hypu
5 1 cmu 192 2 1 au 192 3 3 pku 100 1 4 hypu 81 2 4 lanx 81 2
思路:这题刚开始就想着循环判断计数,但是实际操作完全没思路就找了大佬写的研究了一番,里面用了TreeSet进行添加排序,有几处还是没看懂
相关链接:https://blog.csdn.net/qunqunstyle99/article/details/84887522
代码:
package Test_PTA_1062to1095; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Set; import java.util.TreeSet; public class PTA1085 { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int num = Integer.parseInt(in.readLine()); String[] input = new String[num]; School[] school = new School[10000]; int count = 0;// 学校的个数 for (int i = 0; i < 1000; i++) school[i] = new School(); for (int i = 0; i < num; i++) { input[i] = in.readLine(); } in.close(); for (int i = 0; i < num; i++) { boolean schoolhas = false; String[] value = input[i].split(" "); char rate = value[0].charAt(0);// 考试等级 Loop: for (int j = 0; j < count; j++) {//标记此循环 if (value[2].equalsIgnoreCase(school[j].Name)) { schoolhas = true; switch (rate) { case 'B': school[j].score += Integer.parseInt(value[1]) * 2 / 3;//乙级的分数 school[j].studentNum++; break Loop;//跳出标记的循环 case 'A': school[j].score += Integer.parseInt(value[1]);//甲级的分数 school[j].studentNum++; break Loop; default: school[j].score += Integer.parseInt(value[1]) * 3 / 2;//顶级的分数 school[j].studentNum++; break Loop; } } } if (!schoolhas) { school[count].Name = value[2].toLowerCase();//转成小写 switch (rate) { case 'B': school[count].score += Integer.parseInt(value[1]) * 2 / 3; school[count].studentNum++; school[count].a = rate; break; case 'A': school[count].score += Integer.parseInt(value[1]); school[count].studentNum++; school[count].a = rate; break; default: school[count].score += Integer.parseInt(value[1]) * 3 / 2; school[count].studentNum++; school[count].a = rate; break; } count++; } } //加入TreeSet并排序 Set<School> set = new TreeSet<>(Arrays.asList(school).subList(0, count)); int order =1; int temp =0; int score =0; System.out.println(count); for (School school2 :set) { if(score==school2.score) System.out.print(temp); else { System.out.print(order); temp=order;//保存上一位的排名 } System.out.println(" " + school2.Name + " " + school2.score + " " + school2.studentNum); score = school2.score;//保存上一个人的分数 order++;//前面的人数 } } } class School implements Comparable<School> { String Name; int score; int studentNum; char a; @Override public int compareTo(School o) { //按照分数排序 int result = this.score - o.score; if (result != 0) return -result; else {//按照学生个数排序 result = this.studentNum - o.studentNum; if (result != 0) return result; else {//按字典码排序,既每个字符串依次按照ASCll表排序,小的在前,都相同就按照长度排 result = this.Name.compareTo(o.Name); return result; } } } }