1. 程式人生 > >1025 PAT Ranking Java版

1025 PAT Ranking Java版

原題連結:PAT Ranking

1. 題意

有n個考場,每個考場有k個學生,給出學生的准考證號和分數

要求將所有學生按分數從高到底進行排名,分數相同的按准考證號排名

依次輸出學生的准考證號,總排名,考場號,所在考場排名

2. 思路

首先肯定將學生包裝成學生類,將這些屬性填入

然後最關鍵的地方在於考場排名和總排名

這裡我使用的辦法是對每個考場進行排序,得到學生的local_rank

最後再將所有人排序,得到final_rank

使用Java會卡最後一個測試點。

3. 程式碼

僅供參考,過不了最後一個點,同樣的方法C++能過

package
adv1025; import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main { static class Stu implements Comparable<Stu>{ String id; int score; int finalRank; int
locationNumber; int localRank; public Stu(String id, int score, int locationNumber) { this.id = id; this.score = score; this.locationNumber= locationNumber; } @Override public int compareTo(Stu o) { if
(score == o.score) { return id.compareTo(o.id); } else if (score > o.score) { return -1; } else { return 1; } } @Override public String toString() { return id + " " + finalRank + " " + locationNumber + " " + localRank; } } public static void main(String[] args) { Scanner read = new Scanner(new BufferedInputStream(System.in)); List<Stu> total = new ArrayList<Stu>(); int n = read.nextInt(); for (int i = 1; i <= n; i++) { int k = read.nextInt(); List<Stu> list = new ArrayList<Stu>(); for (int j = 1; j <= k; j++) { Stu stu = new Stu(read.next(), read.nextInt(), i); list.add(stu); total.add(stu); } Collections.sort(list); // 設第一名Rank為1, 遍歷後面的學生, 成績不同則rank=前面的同學+1 list.get(0).localRank = 1; for (int j = 1; j < list.size(); j++) { if (list.get(j-1).score == list.get(j).score) { list.get(j).localRank = list.get(j-1).localRank; } else { list.get(j).localRank = j+1; } } } Collections.sort(total); total.get(0).finalRank = 1; System.out.println(total.size() + "\n" + total.get(0)); for (int i = 1; i < total.size(); i++) { if (total.get(i-1).score == total.get(i).score) { total.get(i).finalRank = total.get(i-1).finalRank; } else { total.get(i).finalRank = i + 1; } System.out.println(total.get(i)); } } }

測試圖:
在這裡插入圖片描述