1. 程式人生 > >PAT-ADVANCED1039——Course List for Student

PAT-ADVANCED1039——Course List for Student

我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED

原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805447855292416

題目描述:

題目翻譯:

1039 學生課程表

浙江大學有4萬名學生,開設2500門課程。 現在給出所有課程的學生名單,你需要為每個來查詢的學生輸出註冊的課程列表。

輸入格式:

每個輸入檔案包含一個測試用例。對於每個測試用例,第一行包含2個正整數:N(<= 40,000),查詢課程列表的學生人數,以及K(<= 2,500),課程總數。然後按以下格式給出課程(編號從1到K)的學生姓名列表:對於每個課程i,首先在一行中給出課程索引i和註冊學生數N(≤200)。 然後在下一行,給出N個選擇該課程的學生姓名。 學生姓名由3個大寫英文字母和一位數字組成。 最後一行包含來查詢的學生的N個名字。 一行中的所有名稱和數字都用空格分隔。

輸出格式:

對於每個測試用例,以N行列印結果。 每行對應一名學生,格式如下:首先列印學生的姓名,然後列印該學生的註冊課程總數,最後按順序遞增課程索引。 必須以與輸入相同的順序列印查詢結果。 一行中的所有資料必須用空格分隔,行末沒有額外的空格。

輸入樣例:

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

輸出樣例:

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

知識點:手動雜湊對映

思路:用字元陣列來儲存字串,手動雜湊對映學生姓名和數字

對於姓名中的大寫字母部分,我們將其視作是一個26進位制數,將其轉換為10進位制,再在末尾添上數字部分即得到了該姓名的雜湊對映數字。

而對於字串的讀取,用string會超時。

時間複雜度和每個學生的選課情況有關。空間複雜度是O(26 * 26 * 26 * 10 + 1)。

C++程式碼:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int change(char* name);

int main(){
	int N, K, courseId, courseCapacity;
	scanf("%d %d", &N, &K);
	char name[5];
	vector<int> students[175761];
	for(int i = 0; i < K; i++){
		scanf("%d %d", &courseId, &courseCapacity);
		for(int j = 0; j < courseCapacity; j++){
			scanf("%s", name);
			int id = change(name);
			students[id].push_back(courseId);
		}
	}
	for(int i = 0; i < N; i++){
		scanf("%s", name);
		int id = change(name);
		printf("%s ", name);
		printf("%d", students[id].size());
		sort(students[id].begin(), students[id].end());
		for(int j = 0; j < students[id].size(); j++){
			printf(" %d", students[id][j]);
		}
		printf("\n");
	}
	return 0;
}

int change(char* name){
	int result = 0;
	for(int i = 0; i < 3; i++){
		result = result * 26 + *(name + i) - 'A';
	}
	result = result * 10 + *(name + 3) - '0';
	return result;
}

C++解題報告: