本题与甲级1047很像,可以一起看,并且灵活检验了STL。是一道好题。
本题注意点:
1.这道题考察每个学生选的课程。是由字符串映射到数字。所以自然而然想到map <string, vector< int> >,但此题用这个最后一个测试往往数值很大会导致超时。所以采用字符串hash求解。
2.如果用二维数组存储学生的课程编号,会导致最后一组测试用例内存超限,所以用vector二维节省空间(每个课选的人不用开辟最大的空间)。
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
int hashgetID(char s[])
{
int id=0;
for(int i=0;i<3;i++)
{
id=id*26+(s[i]-'A');
}
id=id*10+s[3]-'0';
return id;
}
int main()
{
int n,k,course_id,num;//n是学生个数
vector<int> course[26*26*26*10+1];
char name[5];
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&course_id,&num);
for(int j=0;j<num;j++)
{
scanf("%s",&name);
int id=hashgetID(name);
course[id].push_back(course_id);
}
}
for(int i=0;i<n;i++)
{
scanf("%s",&name);
//printf("%s",name);
int id=hashgetID(name);
sort(course[id].begin(),course[id].end());
printf("%s",name);
printf(" %d",course[id].size());
for(int j=0;j<course[id].size();j++)
{
printf(" %d",course[id][j]);
}
printf("\n");
}
return 0;
}
总结:
1.刚开始忘记了空格,全部通过不了。
2.然后最后一个测试点通过不了,发现是hash函数写错了。
理解一下hash函数。类似于十进制数1234,110+2=12,1210+3=123,123*10+4=1234.