PAT甲级1039 Course List for Student (25 分)思路
- 题意:有n个学生选m门课程,(学生姓名用三个大写英文字母和一个数字表示,如ERC3代表一个学生的姓名,课程号用1–m表示)给出每门课的选课情况,最后给出学生姓名,要求输出每个学生选修的课程数和课程编号(由小到大排列)。
- 思路:参考《算法笔记》,用vector动态数组+散列。
- step1:将字符串型的学生姓名转化为int型,用散列表承接起来。
- step2:输入时,对每个课程的学生信息用动态数组保存起来。
- step3:输出时,用循环输出。读入每个学生的姓名,接下去对其选课情况的动态数组由小到大sort排序,输出学生姓名,选课门数以及所选课程的编号即可。
这道题主要是对vector动态数组和散列知识的考察,注重vector基本语法。
去写代码~
(直接粘算法笔记的代码吧,下一题也是一样的,做下一题去)
#include<bits/stdc++.h>
using namespace std;
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;
}
const int N=40010;
const int M=26*26*26*10+1;
vector<int>selectCourse[M];
int main()
{
char name[5];
int k,n;
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++)
{
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]);
}
if(i!=n-1)printf("\n");
}
}