PTA跳转:原题链接
这道题大意是:输入学生数量和课程数量,输入每个学生选择的多种课程。对于每一个课程,先输出该课程的编号所选的学生数量,然后输出每个学生的姓名。
这道题考点是vector(变长数组),难点是有一个测试点会运行超时。
第一次把全部cin和cout都改成scanf和printf,在牛客网上显示的运行时间减少了20%左右,但在PTA中提交仍会运行超时。
然后将vector容器从string类型改为int类型,即从存放学生名改为存放学生编号。(其中,学生编号可以直接通过name[40001][5]获得,可大大缩短运行时间)排序中仍是按字符串大小排序,但传参类型变成了整型。修改了这一点,在牛客网上显示的运行时间变为原来的1/3,在PTA中也通过了。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
char name[40001][5];
bool cmp(int a, int b)
{
return strcmp(name[a], name[b]) < 0; //递增排序
}
int main()
{
int N, K; //学生数量,课程数量,其余为不断改变的临时变量
scanf("%d %d", &N, &K);
vector<int> v[K+1]; //K个vector容器,用于存放选课学生的编号
for(int i = 0; i < N; i++) //N个学生
{
int num, course;
scanf("%s %d", name[i], &num);
for(int j = 0; j < num; j++) //每个学生选了num门课
{
scanf("%d", &course);
v[course].push_back(i); //课程编号为course的容器添加该学生姓名
}
}
for(int i = 1; i <= K; i++) //K个课程
{
printf("%d %d\n", i, v[i].size()); //课程编号和选该课程的学生数量
sort(v[i].begin(), v[i].end(), cmp);
for(int j = 0; j < v[i].size(); j++)
{
printf("%s\n", name[v[i][j]]); //选该课的学生
}
}
return 0;
}
氷鸢鸢鸢
2020.4.19