解题过程的小记录,如有错误欢迎指出。
难度:四星(用输入顺序作为学生序号很巧妙,姓名排序的方法也很神奇)
题目分析
给出学生们的选课情况,要求输出每门课的学生
注意点
- 最后一个测试点的数据量很大,用string的话过不了
我的解题过程
思路
- 用char name[maxStuNum][5]来存放学生的姓名相当于一个string name[maxStuNum],因为没有重复的名字,所以可以将输入顺序直接赋值给姓名当做序号,用来区分姓名
- 用vector<int> course[maxCourseNum]来存放每一门课的学生序号,也就是步骤1里面maxStuNum所表示的数
- 按照以上规则输入数据
- 写一个cmp比较函数,用于按照字母的升序输出name
- 因为是各个course之间的比较,所以只要各个course下的姓名下标重新排序,然后把通过下标找到name进行输出即可
bug
- 用了string,最后一个测试点过不了
- 输出的时候name的下标写错了,应该要写对应的course下面所对应的姓名序号
代码
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
char name[40005][5];
vector<int> course[2505];
int cmp(int a, int b) {
return strcmp(name[a], name[b]) < 0 ? 1 : 0;
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
int coursenum;
scanf("%s %d", name[i], &coursenum);
for (int j = 0; j < coursenum; j++) {
int courseindex;
scanf("%d", &courseindex);
course[courseindex].push_back(i);//这里直接把输入顺序作为学生的序号
}
}
for (int i = 1; i <= k; i++) {
int stunum = course[i].size();
printf("%d %d\n", i, stunum);
if (stunum != 0) {
sort(course[i].begin(), course[i].end(), cmp);
for (int j = 0; j < stunum; j++) {
printf("%s\n", name[course[i][j]]);//**这里原来错写成name[j],下标应该是course[i]里面的对应姓名下标
}
}
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
(本篇我的代码就是参考大佬们写的,这题晴神和柳神思路是一样的,实现方式也差不多,返回来看得话背自己的就好)
- 采用自然输入顺序作为姓名的下标的方法
- char数组的比较方法