打印学生选课清单
打印学生选课清单 (25 分)
假设全校有最多40000名学生和最多2500门课程。现给出每门课的选课学生名单,要求输出每个前来查询的学生的选课清单。
输入格式:
输入的第一行是两个正整数:N(≤40000),为前来查询课表的学生总数;K(≤2500),为总课程数。此后顺序给出课程1到K的选课学生名单。格式为:对每一门课,首先在一行中输出课程编号(简单起见,课程从1到K编号)和选课学生总数(之间用空格分隔),之后在第二行给出学生名单,相邻两个学生名字用1个空格分隔。学生姓名由3个大写英文字母+1位数字组成。选课信息之后,在一行内给出了N个前来查询课表的学生的名字,相邻两个学生名字用1个空格分隔。
输出格式:
对每位前来查询课表的学生,首先输出其名字,随后在同一行中输出一个正整数C,代表该生所选的课程门数,随后按递增顺序输出C个课程的编号。相邻数据用1个空格分隔,注意行末不能输出多余空格。
输入样例:
10 5
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6
输出样例:
ZOE1 2 4 5
ANN0 3 1 2 5
BOB5 5 1 2 3 4 5
JOE4 1 2
JAY9 4 1 2 4 5
FRA8 3 2 4 5
DON2 2 4 5
AMY7 1 5
KAT3 3 2 4 5
LOR6 4 1 2 4 5
我的看法
这道题做了一个下午,最后百度的代码。
样例输出结合输入,一看就知道这绝对是个桶排序。
再一看桶的名字——是字符串,可能需要将字符串转换成数字作为桶的索引或者是写一个下表运算符重载函数。所以自然而然就能想到map上面去。
于是我建立了一个<string,string>的map。后来发现直接存入课程用map不太方便(其实是因为我类型转换不熟悉),所以我换了一个map:map<string,queue>.queue正好控制课程先进先出,我真是个小天才。
搜了一下,的确网上大部分思路都是map解题。
但是我错了,错了两个地方。
1 事实证明,存储名字的map的索引只能是char数组,长度是5即可,如果是string类型的话会超内存。
2 理解错了一个地方,题目有
此后顺序给出课程1到K的选课学生名单
这句话理解错了。他说顺序给出1到K,并没有说按从小到大即1 2 3 4 …… K-1,K的形式给出,它可能是3 2 1 4 5 6 7 8 …… K-1,K。
就是说,没顺序。
**我靠,我现在还不能理解这个脑回路 **不我理解了。(卧槽我干嘛要说谎,唉,还不是因为面子)
为什么我会知道这个呢?因为虽然我内存超限,但是运行结果有一个点是错的,而我自己设计的各种边缘特殊样例都过了。卧槽气死我了bug在哪呢?这个样例特么到底是什么东西啊!?
看了一眼网上的代码,我打算也对我的queue进行一下排序,但是发现STL里面queue没有排序的功能。其实想想也是,queue的作用就是记录先来后到,除了按时间排序,否则排序完之后queue就失去了它的意义。
于是老老实实地照着网上学了一下迭代器,用<string,vector>实现的。
下面粘一下我用queue实现的要求输入时排好序的代码和改正之后自带sort()函数功能的代码:
queue的WA代码:
#include<iostream>
#include<string>
#include<queue>
#include<map>
using namespace std;
int main() {
map<string, queue<int>> m;
int N, K; cin >> N >> K;
int course, numofstudent;
string student;
for (int zu = 0; zu < K; zu++) {
cin >> course >> numofstudent;
for (int i = 0; i < numofstudent; i++) {
cin >> student;
m[student].push(course);
}
}
for (int i=0; i < N; i++) {
cin >> student;
cout << student << " " << m[student].size();
while (!m[student].empty()) {
cout << " ";
cout << m[student].front();
m[student].pop();
}
cout << endl;
}
system("pause");
return 0;
}
用vector实现的AC代码:
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
map<string, vector<int>>m;
map<string, vector<int>>::iterator it;
int main()
{
int N, M, tem, numofstudent; cin >> N >> M;
char student[5];
for (int i = 1; i <= M; i++) {
cin >> tem >> numofstudent;
for (int j = 0; j < numofstudent; j++) {
scanf("%s", student);
m[student].push_back(tem);
}
}
for (int i = 0; i < N; i++) {
scanf("%s", student);
it = m.find(student);
int len = it->second.size();
printf("%s %d", student, len);
sort(it->second.begin(), it->second.end());
for (int j = 0; j < len; j++) {
printf(" %d", it->second[j]);
}
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号