1

题目大意:

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

算法思路:

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

注意点:

1、如果最后一组数据超时,将string换成char数组,cin换成scanf,cout换成printf。
2、不要使用set,不仅时间耗费大而且最后一个测试点无法通过,不知道什么原因,我感觉合理的解释就是存在一门课里面有相同名字的学生。

提交结果:

image.png

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

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得