关于算法-数据结构:PAT甲级1039-Course-List-for-Student

38次阅读

共计 1080 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心:

有 N 个学生,K 门课。当初给出抉择每门课的学生姓名,并在之后给出 N 个学生的姓名,要求按程序给出每个学生的选课状况。

算法思路:

输出的时候给出的是每一个课程的编号与所有抉择该们课程的学生的关系,咱们当初只须要建设每一个学生与所有抉择的课程的关系即可,这里应用 unordered_map<string,set<int>> studentToCourses 来存储每一个学生所抉择所有的课程编号,这样在输出每一个课程 course 的学生 student 的时候就能够为每一个学生保留抉择的课程studentToCourses[student].insert(course),而后对于每一个查问的学生,就能够间接输入每一个学生抉择的课程数和所有的课程。

留神点:

1、开二维数组的化,最初一组测试点会内存超限。
2、这里应用了 set 实现了主动排序,这会导致工夫过长,如果呈现超时的状况,能够换成 vector,不过得在输入的时候得排序。

提交后果:

AC 代码:

#include <cstdio>
#include <set>
#include <unordered_map>
#include <iostream>

using namespace std;

unordered_map<string,set<int>> studentToCourses;// 存储每一个学生的所有的课程

int main(){
    int N,K;// 查问课程的人数和课程数目
    scanf("%d %d",&N,&K);
    // 对于每一个课程,课程号从 1 开始
    int course,num;// 课程号和抉择该课程的学生数目
    string student;// 学生名字
    for (int i = 0; i < K; ++i) {scanf("%d %d",&course,&num);
        for (int j = 0; j < num; ++j) {
            cin>>student;
            studentToCourses[student].insert(course);// 为每一个学生增加其抉择的课程
        }
    }
    // 查问开始
    for (int k = 0; k < N; ++k) {
        cin>>student;
        // 输入该学生的所有的抉择课程
        cout<<student<<" "<<studentToCourses[student].size();
        set<int>::iterator it;
        for(it = studentToCourses[student].begin();it!=studentToCourses[student].end();++it){printf("%d",(*it));
        }
        printf("\n");
    }
    return 0;
}

正文完
 0