题目粗心:

给出选课人数和课程数目,而后再给出每个人的选课状况,请针对每门课程输入选课人数以及所有选该课的学生的姓名。

算法思路:

该题和1039是姊妹题,思路其实是一样的,就是给定了一个正向的关系,当初须要建设一个反向的关系,这里是须要建设每一个课程与所有抉择该门课程的学生。咱们应用unordered_map<int,vector<string>> courseToStudents代表这个映射,所有的映射关系在输出的时候就能够建设(具体见代码),而后再输入所有的每一个课程的编号,抉择该课程的学生数,以及所有的所有的学生。在输入所有的学生前得先排序。

留神点:

1、如果最初一组数据超时,将string换成char数组,cin换成scanf,cout换成printf。
2、不要应用set,不仅工夫消耗大而且最初一个测试点无奈通过,不晓得什么起因,我感觉正当的解释就是存在一门课外面有雷同名字的学生。

提交后果:

AC代码:

#include <cstdio>#include <vector>#include <unordered_map>#include <algorithm>#include <string>using namespace std;unordered_map<int,vector<string>> courseToStudents;// 课程和所有选该课的学生映射int main(){    int N,K;//学生数目和课程数目    scanf("%d %d",&N,&K);    string student;    int courseNum;    int course;    char s[30];    for (int i = 0; i < N; ++i) {        scanf("%s %d",s,&courseNum);        student = s;        for (int j = 0; j < courseNum; ++j) {            scanf("%d",&course);            courseToStudents[course].push_back(student);        }    }    // 输入每一门课的所有学生    for (int k = 1; k <= K; ++k) {        printf("%d %lu\n",k,courseToStudents[k].size());        sort(courseToStudents[k].begin(),courseToStudents[k].end());        for (auto & i : courseToStudents[k]) {            printf("%s\n",i.c_str());        }    }    return 0;}