(排序) $O(nlogn)$
java自定义排序
java代码
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader bw = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bw.readLine());
int[][] arr = new int[n][5];
for(int i = 0; i < n; i++){
String[] strs = bw.readLine().split(" ");
arr[i][0] = i + 1; //第i位同学号
arr[i][1] = Integer.parseInt(strs[0]); //语文成绩
arr[i][2] = Integer.parseInt(strs[1]); //数学成绩
arr[i][3] = Integer.parseInt(strs[2]); //英语成绩
arr[i][4] = arr[i][1] + arr[i][2] + arr[i][3]; //总分
}
//自定义对二维数组排序,匿名内部类实现
Arrays.sort(arr, new Comparator<int[]>(){
public int compare(int[] o1,int[] o2){
if(o1[4] > o2[4]) return -1; //先比较总分
else if(o1[4] < o2[4]) return 1;
else if(o1[1] > o2[1]) return -1; //再比较语文成绩
else if(o1[1] < o2[1]) return 1;
else if(o1[0] < o2[0]) return -1; //最后比较学号
return 1;
}
//由于Arrays.sort()默认从小到大排序,而我们要从大到小排序,所以我们在比较总分和语文成绩的时候,
//把比较的结果反一下就行(如o1 > o2 我们就返回-1,这样o1就会排在o2前面),
//而比较学号的时候,学号越小越靠前
});
for(int i = 0; i < 5; i++) System.out.println(arr[i][0] + " " + arr[i][4]);
}
}