⬆︎
×

[PAT-A] 1047 Student List for Course

Hyplus目录

Java

测试点3内存超限

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {
    static final int N = 40010;
    static final int M = 2510;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        String[] name = new String[N];
        List<Integer>[] list = new ArrayList[M];
        for (int i = 0; i < M; i++) {
            list[i] = new ArrayList<>();
        }

        // 读取学生姓名和其注册的课程
        for (int i = 0; i < n; ++i) {
            st = new StringTokenizer(br.readLine());
            String s = st.nextToken();
            int num = Integer.parseInt(st.nextToken());
            name[i] = s;

            for (int j = 0; j < num; j++) {
                int x = Integer.parseInt(st.nextToken());
                list[x].add(i);
            }
        }

        br.close();

        // 输出课程注册信息
        for (int i = 1; i <= k; ++i) {
            System.out.println(i + " " + list[i].size());

            // 按学生姓名的字典顺序排序
            list[i].sort(Comparator.comparing(a -> name[a]));

            for (int idx : list[i]) {
                System.out.println(name[idx]);
            }
        }
    }
}

C++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 40010, M = 2510;

int n, k;
string name[N];
vector<int> list[M];

int main() {
    scanf("%d%d", &n, &k);

    char s[7];
    for (int i = 0; i < n; ++i) {
        int num;
        scanf("%s%d", s, &num);
        name[i] = s;

        while (num--) {
            int x;
            scanf("%d", &x);
            list[x].push_back(i);
        }
    }

    for (int i = 1; i <= k; ++i) {
        printf("%d %d\n", i, list[i].size());

        sort(list[i].begin(), list[i].end(), [](int &a, int &b) {
            return name[a] < name[b];
        });
        for (auto it: list[i])
            printf("%s\n", name[it].c_str());
    }

    return 0;
}

发表评论