PAT 甲级【1012 The Best Rank】

发布时间 2023-10-26 22:10:44作者: fishcanfly
  1. 本题用java极容易超时,提交了好几次才成功
  2. 另外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();
    }
}