题目链接
注意点:
1.如果使用string存放姓名,最后一个样例会超时,数据很多的情况下用string容易超时,最好用char *;
2.将姓名加入vector中时要注意压进去的是字符数组的地址,要新建数组存入不同姓名并将其地址作为指针传递,不能对一个字符数组反复使用,最后只会保存最后输入的姓名。
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(char a[],char b[]){//字典序排序
return strcmp(a,b)<0;
}
vector<char*> names[2501];
//names[i]存放课程号为i的学生的姓名
int main(){
int n,k,c,course;
char name[5];
scanf("%d%d",&n,&k);//学生数、课程数
for(int i=0;i<n;i++){//对每个学生遍历
scanf("%s %d",name,&c);//姓名、选课数
for(int j=0;j<c;j++){
scanf("%d",&course);//课程id
char *b=new char[5];//要新建数组
strcpy(b,name);//对新数组赋值
names[course].push_back(b);//将新数组的指针压入
}
}
for(int i=1;i<=k;i++){
printf("%d %d\n",i,names[i].size());//输出课程id、选课人数
sort(names[i].begin(),names[i].end(),cmp);
//将选课的人的姓名按字典序排序
for(int j=0;j<names[i].size();j++){
printf("%s\n",names[i][j]);
//输出姓名
}
}
return 0;
}