生活随笔
收集整理的這篇文章主要介紹了
PAT 1025 PAT Ranking题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大致題意:
輸入所有考生的考號以及所有考生的成績,以及考生所在的考場號。
輸出格式:
考生的考場號 考生的總名次 考生所在的考場號 考生所在考場的名次
首先解決考生的排名問題,應當先對考生在本考場所取得的名次進行排序,再對總體進行一次排序(思路有點類似于基數排序);排序時首先按照成績進行降序排序,再按照id的字典序排序就可以了;
這個題的難點在于考生名次的計算,解決方法是設置3個變量:
int same = 1;//對于一個成績,得分相同的考生人數,初始值為1int pre ; //按照排序結果,前一個考生的成績int rank ; //排名
思路:
如果該名考生的成績與前一個考生的成績(pre的值)相同,則直接把rank作為該考生的成績賦值給該考生,并令same加1,表明該多了一個考了pre分的考生;
if(pre == stu.getScore()) {same ++;stu.setRank(rank);}
如果該名考生的成績與前一個考生的成績不同,則新的名次為rank + same,同時置same為1;
else{rank += same;stu.setRank(rank);same = 1;
}
這樣就解決了重名問題;
具體的JAVA代碼如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);ArrayList<student> buf = new ArrayList<student>(); //buf僅僅暫存一個考場的考生數據ArrayList<student> List = new ArrayList<student>();//List是所有的數據int N = sc.nextInt();int cnt = 0;for (int i = 1; i <= N; ++i) {int K = sc.nextInt();for (int j = 1; j <= K; ++j) {cnt++;String id = sc.next();int score = sc.nextInt();student stu = new student(id, score, i);buf.add(stu);}int pre = 100000; // 這里每完成一個考場中所有考生的成績輸入,就進行排序int rank = 0; //獲得考場上的排名。首先設置一個超高分100000作為第0名int same = 1; //考生的得分,這樣可以簡化代碼的邏輯。Collections.sort(buf); for (int k = 0; k < buf.size(); ++k) {student stu = buf.get(k);if (stu.getScore() != pre) {rank += same; //stu.setRank_loc(rank); //考場排名,總排名設置方法類似same = 1;pre = stu.getScore(); //及時更新新的得分} else {same++;stu.setRank_loc(rank);}}List.addAll(buf);buf.clear();}Collections.sort(List);int pre = 10000;int rank = 0;int same = 1;for (int i = 0; i < List.size(); ++i) {student stu = List.get(i);if (stu.getScore() != pre) {rank += same;stu.setRank_total(rank); //設置總排名same = 1;pre = stu.getScore();} else {same++;stu.setRank_total(rank);}}sc.close();System.out.println(cnt);for (int i = 0; i < List.size(); ++i) {student stu = List.get(i);System.out.println(stu);}}
}class student implements Comparable<student> {private String id;private int score;private int rank_total;private int rank_loc;private int loc;public student(String id, int score, int loc) {this.id = id;this.score = score;this.loc = loc;}public int getScore() {return this.score;}public String toString() { //重載輸出方法return (id + " " + rank_total + " " + loc + " " + rank_loc);}public void setRank_loc(int rank_loc) { //設置考場排名this.rank_loc = rank_loc;}public void setRank_total(int rank_total) { //設置總排名this.rank_total = rank_total;}private int cmp_score(int a, int b) {if (a < b)return 1;elsereturn -1;}public int compareTo(student stu) {if (this.score != stu.score) {return cmp_score(this.score, stu.score);} elsereturn this.id.compareTo(stu.id);}
}
總結
以上是生活随笔為你收集整理的PAT 1025 PAT Ranking题解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。