1039 Course List for Student (25 分)
题意
给出一组数据,包括课程编号,以及选择该课的学生姓名,姓名是由三个大写字母加一个数字组成。最后给出所有学生的姓名,求这些学生的选课内容。每个学生的选课内容按课程编号从小到大输出。
N,学生数量,N<=4000
K,课程数量,K<=2500
思路
将学生姓名映射成数字方便存储学生信息。用vector数组存储学生信息,最后输出前对每个学生的选课信息排序,从小到大输出。
姓名映射:可将三个大写字母看成26进制的数,然后转换成十进制数即可。
262610*25,数据范围还是比较小的。
代码
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>student[250700];
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()
{
int n,k,x,y,id;
char name[5];
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++){
scanf("%d%d",&x,&y);
for(int j=0;j<y;j++){
getchar();
scanf("%s",name);
id=getId(name);
student[id].push_back(x);
}
}
for(int i=0;i<n;i++){
scanf("%s",name);
printf("%s ",name);
id=getId(&name[0]);
if(student[id].size()==0){
printf("0");
}else{
printf("%d",student[id].size());
sort(student[id].begin(),student[id].end());
for(int j=0;j<student[id].size();j++){
printf(" %d",student[id][j]);
}
}
printf("\n");
}
return 0;
}