1. 程式人生 > >(PAT)1047 Student List for Course (雜湊的應用)

(PAT)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

解題思路:

const int maxn = 40010;  //學生數量
const int maxc = 2510;   //課程數量

char name[maxn][5];  //學生表
vector<int> course[maxc];  //存放第i門課所有學生編號

我們可以構建兩個表,第一個表用來儲存學生的姓名,maxn陣列字尾可以用來作為學生的ID

第二個表是課程表,用來儲存各課程所報名參加的學生(儲存在vector<int>中) maxn陣列字尾可以用來作為課程ID

我們可以把輸入的學生用先定義一個標識,並把這個標識作為陣列索引來儲存學生名

然後再把這個標識放到對應的課程容器中去

      int i = 0;
	for (; i < n; ++i) {
		int scours;
		scanf("%s %d", name[i], &scours);
		for (int j = 0; j < scours; ++j) {
			int cno;
			scanf("%d",&cno);
			course[cno].push_back(i);   //存放第i門課所有學生編號
		}
	}

輸出時,我們按順序輸出課程號和報名學生的數量

然後根據題意按照字典序輸出學生名

這裡先要對學生名排序,我們可以寫一個元函式

bool cmp(int a, int b) {
	return strcmp(name[a], name[b]) < 0;   //名字按照字典序排序
}

然後進行排序

sort(course[i].begin(), course[i].end(), cmp);

然後輸出就可以了

for (int i = 1; i <= k; ++i) {
		printf("%d %d\n", i, course[i].size());
		sort(course[i].begin(), course[i].end(), cmp);  //按照字典序排序
		for (int j = 0; j < course[i].size(); ++j) {
			printf("%s\n", name[course[i][j]]);
		}
	}