题目注意点
- 输出选课学生的姓名时,需要按照字典序输出,写比较函数的时候可以直接比较学生名字的下标,更快
实现
用二维字符数组存储每个学生的姓名,每个姓名对应一个下标,正好可以存进课程的vector中
#include <string.h>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 40010;
const int maxc = 2510;
vector<int> course[maxc];
char name[maxn][5];
bool cmp(int a, int b) {
return strcmp(name[a], name[b]) < 0;
}
int main() {
int n, k, cn, index;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%s%d", name[i], &cn);//读取学生i的姓名,选课数
for (int j = 0; j < cn; j++) {
scanf("%d", &index);
course[index].push_back(i);//index这门课加上一个学生i
}
}
for (int i = 1; i <= k; i++) {
int size = course[i].size();
printf("%d %d\n", i, size);//第i门课的学生数
sort(course[i].begin(), course[i].end(), cmp);
for (int j = 0; j < size; j++) {
printf("%s\n", name[course[i][j]]);
}
}
return 0;
}