您的位置:首页 > 其它

1039. Course List for Student

2018-02-22 11:33 375 查看

Course List for Student

Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists of all the courses, you are supposed to output the registered course list for each student who comes for a query.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive integers: N (<=40000), the number of students who look for their course lists, and K (<=2500), the total number of courses. Then the student name lists are given for the courses (numbered from 1 to K) in the following format: for each course i, first the course index i and the number of registered students Ni (<= 200) are given in a line. Then in the next line, Ni student names are given. A student name consists of 3 capital English letters plus a one-digit number. Finally the last line contains the N names of students who come for a query. All the names and numbers in a line are separated by a space.

Output Specification:

For each test case, print your results in N lines. Each line corresponds to one student, in the following format: first print the student’s name, then the total number of registered courses of that student, and finally the indices of the courses in increasing order. The query results must be printed in the same order as input. All the data in a line must be separated by a space, with no extra space at the end of the line.

Sample Input:

11 5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6 NON9


Sample Output:

ZOE1 2 4 5
ANN0 3 1 2 5
BOB5 5 1 2 3 4 5
JOE4 1 2
JAY9 4 1 2 4 5
FRA8 3 2 4 5
DON2 2 4 5
AMY7 1 5
KAT3 3 2 4 5
LOR6 4 1 2 4 5
NON9 0


题意

第一行给出要查询课程的总人数以及课程总数,然后依次给出每个课程的编号、参与人数和具体的参与名单,最后一行给出要查询课程的具体名单,要求依次给出查询者的姓名、查询者参与的课程数、查询者具体参与的课程编号(升序)。

思路

为了节省时间直接将学生名字转换开散列,用vector来记录每个学生参与的课程,最后排序输出即可。

代码实现

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int maxn = 26 * 26 * 26 * 10 + 1;         // 开散列最大长度,3位26进制1位10进制
vector<int> check[maxn];                        // 散列表,记录每个人参加的课程

int hashFunc(char name[])       // 将名字转换为整数
{
int ans = 0;
for (int i = 0; i < 3; i++)
ans = ans * 26 + name[i] - 'A';
ans = ans * 10 + name[3] - '0';
return ans;
}

int main()
{
int n, k;
int id, num;
int temp;           // 记录名字散列转换后的整数
char name[5];
vector<int>::iterator it;

scanf("%d %d", &n, &k);
for (int i = 0; i < k; i++)
{
scanf("%d %d", &id, &num);
for (int j = 0; j < num; j++)
{
scanf("%s", name);
temp = hashFunc(name);
check[temp].push_back(id);
}
}

for (int i = 0; i < n; i++)
{
scanf("%s", name);
temp = hashFunc(name);
printf("%s %d", name, check[temp].size());         // size即为参加课程总数
sort(check[temp].begin(), check[temp].end());      // 课程号升序排列
if (check[temp].size())
for (it = check[temp].begin(); it != check[temp].end(); it++)
printf(" %d", *it);
printf("\n");
}

return 0;
}


一开始做的时候并没有使用sort函数,而是直接开了一个set的散列来实现自动排序,但在最后一个点超时了,原因在于set会对所有学生的课程进行排序,包括了并不需要输出的学生,在数据较多时就会浪费很多时间,所以还是老老实实用sort吧。

参考

CSDN博客 - iaccepted
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT