题目粗心:
有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;}