(pat甲)1039 Course List for Student

it2025-01-14  14

这道题因为最后一组数据庞大,所以使用map和string会超时,也不要使用cin和cout进行输入或者输出,若用二维数组存放学生所选的课程编号会导致最后一组数据内存超限,所以使用vector来减少空间消耗

#include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int N = 40000;//总人数 const int M = 26 * 26 * 26 + 1;//由名字散列组成的数字上界 vector<int> selectcourse[M];//每个学生选择的课程编号 int getid(char name[])//hash函数,将字符串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() { int n, k;//人数以及课程数 char name[5]; scanf("%d%d", &n, &k); for (int i = 0; i < k; i++) { int course, x; scanf("%d%d", &course, &x);//输入课程编号与选课人数 for (int j = 0; j < x; j++) { scanf("%s", name); int id = getid(name);//将姓名散列成为一个整数作为编号 selectcourse[id].push_back(course);//将该课程编号加入学生选择中 } } for (int i = 0; i < n; i++)//n个查询 { 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; }
最新回复(0)