PAT A1047 Student List for Course (25point(s))

题目链接
注意点:
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;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 649

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105588766