1025 PAT Ranking Java版
阿新 • • 發佈:2018-11-17
原題連結: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));
}
}
}
測試圖: