- 本题用java极容易超时,提交了好几次才成功
- 另外90 88 77 77 50,名次应该是1 2 3 3 5 ,不是1 2 3 3 4
import java.io.*; public class Main { @SuppressWarnings("unchecked") public static void main(String[] args) throws IOException { StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in)); int n, m; st.nextToken(); n = (int) st.nval; st.nextToken(); m = (int) st.nval; int[] id = new int[n]; int[][] score = new int[n][4]; int[][] pl = new int[4][101]; for (int i = 0; i < n; i++) { st.nextToken(); id[i] = (int) st.nval; int avg = 0; for (int j = 0; j < 3; j++) { st.nextToken(); score[i][j] = (int) st.nval; avg += score[i][j]; pl[j][score[i][j]]++; } score[i][3] = (int) (Math.round((double) avg / 3)); pl[3][score[i][3]]++; } int[][] rank = new int[n][4]; for (int i = 0; i < 4; i++) { int[] sum = new int[101]; sum[100] = 0; for (int j = 99; j >= 0; j--) { sum[j] = sum[j + 1] + pl[i][j + 1]; } for (int j = n - 1; j >= 0; j--) { rank[j][i] = sum[score[j][i]] + 1; } } StringBuilder[] rankmap = new StringBuilder[1_000_000]; for (int i = 0; i < n; i++) { int min = n + 1; for (int j = 0; j < 4; j++) { if (min > rank[i][j]) { min = rank[i][j]; } } StringBuilder sb = new StringBuilder(); sb.append(min).append(" "); if (rank[i][3] == min) { sb.append("A"); rankmap[id[i]] = sb; } else if (rank[i][0] == min) { sb.append("C"); rankmap[id[i]] = sb; } else if (rank[i][1] == min) { sb.append("M"); rankmap[id[i]] = sb; } else if (rank[i][2] == min) { sb.append("E"); rankmap[id[i]] = sb; } } PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < m; i++) { st.nextToken(); int searchedid = (int) st.nval; if (rankmap[searchedid] == null) { sb.append("N/A"); } else { sb.append(rankmap[searchedid]); } sb.append("\n"); } pw.print(sb); pw.flush(); } }