PAT 甲级【1012 The Best Rank】

  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();
    }
}

 

简单优化下:

import java.io.*;

public class Main {
   static char[] arr = new char[]{'C', 'M', 'E', 'A'};
    @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;
            int index = 0;
            for (int j = 0; j < 4; j++) {
                if (min > rank[i][j] || (j == 3 && min == rank[i][j])) {
                    min = rank[i][j];
                    index = j;
                }
            }

            StringBuilder sb = new StringBuilder();
            sb.append(min).append(" ").append(arr[index]);
            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();
    }
}

  

posted @ 2023-10-26 22:04  fishcanfly  阅读(21)  评论(0)    收藏  举报
//雪花飘落效果