PAT A 1047.Student List for Course (25)

本文介绍了一个学生选课系统的实现方案,通过将学生姓名映射为ID进行排序,有效地提高了处理大量学生选课数据时的效率。系统可以输出每门课程的学生名单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Zhejiang University has 40000 students and provides 2500 courses. Nowgiven the registered course list of each student, you are supposed to outputthe student name lists of all the courses.

Input Specification:

Each input file contains one test case. For each case, the first linecontains 2 numbers: N (<=40000), the total number of students, and K(<=2500), the total number of courses. Then N lines follow, each contains astudent's name (3 capital English letters plus a one-digit number), a positivenumber C (<=20) which is the number of courses that this student hasregistered, 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 inincreasing order of the course numbers. For each course, first print in oneline the course number and the number of registered students, separated by aspace. Then output the students' names in alphabetical order. Each nameoccupies 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

 

类似1039,需要将名字转换为id,再排序。

否则会增加排序时比较的代价,而这个代价的倍数是n*log(n)的,会导致超时

 

代码:

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

int To_id(char name[5]);	//名字转id
void To_name(int id,char name[5]);	//id转名字

int main()
{
	int n,k;
	vector<int> course[2501];	//对应课程编号的选择的人
	cin>>n>>k;

	int num_reg,temp_cou,i,j;	//每门课选的人,输入某个人选的课的临时数据
	char name[5];	//名字
	for(i=0;i<n;i++)	//循环输入数据
	{
		scanf("%s",name);
		scanf("%d",&num_reg);
		for(j=0;j<num_reg;j++)
		{
			scanf("%d",&temp_cou);
			course[temp_cou].push_back(To_id(name));
		}
	}
	for(i=1;i<=k;i++)	//输出各门课的信息
	{
		printf("%d %d\n",i,course[i].size());
		if(!course[i].empty())
		{
			sort(course[i].begin(),course[i].end());
			for(j=0;j<course[i].size();j++)
			{
				To_name(course[i][j],name);
				printf("%s\n",name);
			}
		}
	}

	return 0;
}

int To_id(char name[5])
{
	return (name[0]-'A')*6760+(name[1]-'A')*260+(name[2]-'A')*10+name[3]-'0';
}

void To_name(int id,char name[5])
{
	name[0]=id/6760+'A';
	id%=6760;
	name[1]=id/260+'A';
	id%=260;
	name[2]=id/10+'A';
	id%=10;
	name[3]=id+'0';
}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值