题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805433955368960
这题是上一题的反转
- 像这种数据范围很大的题目,最好都使用char,使用string容易超时
- 这题最值得借鉴的是二维数组存储姓名,但也容易搞混
- 另一个值得借鉴的地方是,一般结果按顺序输出啥,就建立那个对象的vector数组,比如这道题要输出每门课的选课名单,那么最后一轮for循环一定是课程,因此建立课程的vector二维数组
代码
#include<algorithm>#include<iostream>#include<vector>#include<cstring>using namespace std;const int maxn_of_stu = 40010;const int maxn_of_course = 2510;char name[maxn_of_stu][5];bool cmp(int a, int b){return strcmp(name[a], name[b]) < 0;//按字典序从小到大排序}int main(){int stu_num, course_num, temp;vector<int> course[maxn_of_course];int course_temp;scanf("%d%d",&stu_num, &course_num);for(int i = 0; i < stu_num; i++){scanf("%s %d",name[i], &course_temp);for(int j = 0; j < course_temp; j++){scanf("%d",&temp);course[temp].push_back(i);}}for(int i = 1; i <= course_num; i++){int len = course[i].size();sort(course[i].begin(),course[i].end(), cmp);printf("%d %d\n", i, len);for(int j = 0; j < len; j++){printf("%s\n", name[course[i][j]]);}}}
