C++ STL vector A1047 Student List for Course(25) (注意字符串型的存储方式:用char [N][5]来存储)

没有想到以二维数组 char [N][5] 存放输入的姓名,自己尝试用vector<char> 失败了。

小技巧:如果排序时直接对字符串排序,那么会导致大量的字符串移动,非常耗时间,因此比较合适的做法是使用字符串的下标来代替字符串本身进行排序,这样消耗的时间会少得多

strcmp 的返回值不一定是 -1 , 0 , +1 ,也有可能是其他正数和负数。因此在写cmp函数时不能写strcmp的返回值等于-1 , 必须写 < 0 

#include <bits/stdc++.h>
#include<math.h>
#include <string>
using namespace std;
const int maxn = 40010;//最大学生人数
const int maxc = 2510;//最大课程门数
char name[maxn][5];//maxn个学生
vector<int> course[maxc];//course[i]存放第i门课的所有学生编号
bool cmp(int a,int b){
    return strcmp(name[a],name[b]) < 0;
}
int main(){
    int n,k,c,courseID;
    scanf("%d%d",&n,&k);//学生人数及课程数
    for(int i = 0;i<n;++i){
        scanf("%s %d",name[i],&c);//学生姓名及选课数
        for(int j = 0;j<c;++j){
            scanf("%d",&courseID);
            course[courseID].push_back(i);//将学生i 加入第courseID门课中
        }
    }
    for(int i = 1;i<=k;++i){
        printf("%d %d
",i,course[i].size());//第i门课的学生数
        sort(course[i].begin(),course[i].end(),cmp);
        for(int j =0;j<course[i].size();++j){
            printf("%s
",name[course[i][j]]);
        }
    }
    system("pause");
    return 0;
} 
原文地址:https://www.cnblogs.com/JasonPeng1/p/12199292.html