[PAT-A 1039]Course List for Student

在这里插入图片描述
在这里插入图片描述

题目大意:
有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;
}
发布了142 篇原创文章 · 获赞 1 · 访问量 4571

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104293343
今日推荐