1047 Student List for Course

Zhejiang University has 40,000 students and provides 2,500 courses. Now given the registered course list of each student, you are supposed to output the student name lists of all the courses.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 numbers: N (≤40,000), the total number of students, and K (≤2,500), the total number of courses. Then N lines follow, each contains a student's name (3 capital English letters plus a one-digit number), a positive number C (≤20) which is the number of courses that this student has registered, and then followed by C course numbers. For the sake of simplicity, the courses are numbered from 1 to K.

Output Specification:

For each test case, print the student name lists of all the courses in increasing order of the course numbers. For each course, first print in one line the course number and the number of registered students, separated by a space. Then output the students' names in alphabetical order. Each name occupies a line.

Sample Input:

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

Sample Output:

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

 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

//这都能有超时?
// 直接使用cin和cout会有超时数据

//总结:对于大量数据的插入和输出,cin和cout就表现出自己时间复杂度的劣势了
//在庞大数据面前cin和cout会超时,因此要用回scanf和printf来减少用时

int main()
{
	//vector<string>Student[2510];//容器数组容易超时
	vector<vector<string>>Student;
	//还是超时了
	//容器跟数组一样的,都是要设置大小才能直接用,不然空间就只有一个


	int n, k, c;
	cin >> n >> k;
	Student.resize(k + 1);//存放的是不同课室编号
	//如果只是单个容器,可以插入来改变大小, 但嵌套容器的下标,也就是表示不同的数组,是要用resize来开辟大小
	for (int i = 0; i < n; i++)
	{
		string name;
		//每轮都开一个name,用完就释放

		name.resize(4);//resize设置字符串的长度
		//使用string的时候如果要用scanf,就必须要设置string的长度
		//因为string本身是无限长的,与scanf冲突了
		//然后使用scanf时必须要写出开始插入的下标,然后使用%s类型
		
		//原因就在于scanf不兼容string类型,所以要转化
		//sancf必须要明确数组的长度,然后因为不兼容你还要写出下标才能明确
		//你的string是个数组,确定了下标和数组大小scanf才能插入.
		
		//当然觉得麻烦可以用char数组
		scanf("%s %d", &name[0], &c);//scanf不能直接输入string类型 
		for (int j = 0; j < c; j++)
		{
			int id;
			scanf("%d", &id);
			Student[id].push_back(name);

		}
	}

	for (int i = 1; i <= k; i++)
	{
		printf("%d %d\n", i, Student[i].size());
//		sort(Student[i], Student[i] + Student[i].size(),cmp);
		//容器排序用begin与end
		sort(Student[i].begin(), Student[i].end());
		//系统默认字典序,不需要给出方法
		for (int j = 0; j < Student[i].size(); j++)
		{
			printf("%s\n", Student[i][j].c_str());
			//[i]为课室编号
			//[j]为每个学生的位置
			//c_str() 函数可以将 const string* 类型 转化为 const char* 类型
			//因为printf不兼容string类型,所以要转化然后输出
			
		}
		
	}


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值