【题解】【AcWing】1531. 课程学生列表

71 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1531. 课程学生列表

原题传送:AcWing 1531. 课程学生列表

浙江大学有 4000040000 名学生,提供 25002500 门课程。

现在给定每个学生的选课列表。

请你统计,每门课程的学生报名情况。

输入格式

第一行包含两个整数 NNKK ,分别表示学生总数和课程总数。

接下来 NN 行,每行包含一个学生的选课列表,首先包含学生姓名(三个大写字母加一位数字),然后包含一个整数 CC ,表示该学生报课总数,接下来包含 CC 个整数,表示所报课程编号。

所有课程编号为 1K1 \sim K

输出格式

按照课程编号升序的顺序输出每一门课的报名情况。

每门课输出信息时,第一行包含两个整数,分别表示课程编号以及报名人数。

接下来若干行,按字典序输出报名的具体人员姓名,每个姓名占一行。

数据范围

1N400001 \le N \le 40000 , 1K25001 \le K \le 2500 , 1C201 \le C \le 20 ,

输入样例:

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

输出样例:

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

思路:

unordered_map记录课程编号对应的学生列表。

题解:

#include<bits/stdc++.h>

using namespace std;

int n, k;
unordered_map<int, vector<string>> mp;

int main()
{	
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= n; i++)
	{
		char name[4];
		int c;
		scanf("%s%d", name, &c);
		
		while(c--)
		{
			int x;
			scanf("%d", &x);
			mp[x].push_back(name);
		}
	}
	
	for(int i = 1; i <= k; i++)
	{
		printf("%d %d\n", i, mp[i].size());
		sort(mp[i].begin(), mp[i].end());
		for(auto e : mp[i])
			printf("%s\n", e.c_str());
	}

	return 0;
}