题目大意:
有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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。