题目大意:
有N个学生,K门课,现在给出选择每门课的学生姓名,并在之后给出N个学生的姓名,要求按顺序给出每个学生选课的情况。
思路:
1)首先需要键给学生姓名与编号之间对应起来,采用字符串hash的思想.(map或者string会超时)。
2)建立vector数组 vector selectCourse[M],其中M至少为262626*10,因为学生名字有三个字母和一个数字组成。
3)读入时将ID由str类型转成int型,将该同学选的课程编号压入vector数组中。
4)输出时要将课程编号从小到大排序。
AC代码:
//PAT_A 1039
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 40010;
const int M = 26 * 26 * 26 * 10 + 1;
vector<int> selectCourse[M];
int getID(char name[]) {
int id = 0;
for (int i = 0; i < 3; i++) {
id = id * 26 + (name[i] - 'A');
}
id = id * 10 + (name[3] - '0');
return id;
}
int main() {
char name[5];
int n, k;
(void)scanf("%d %d", &n, &k);
for (int i = 0; i < k; i++) {
int course, x;
(void)scanf("%d %d", &course, &x);
for (int j = 0; j < x; j++) {
(void)scanf("%s", name);
int id = getID(name);
selectCourse[id].push_back(course);
}
}
for (int i = 0; i < n; i++) {
(void)scanf("%s", name);
int id = getID(name);
sort(selectCourse[id].begin(), selectCourse[id].end());
printf("%s %d", name, selectCourse[id].size());
for (int j = 0; j < selectCourse[id].size(); j++) {
printf(" %d", selectCourse[id][j]);
}
printf("\n");
}
return 0;
}