目录
1,题目描述
Sample Input:
11 5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6 NON9
Sample Output:
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
NON9 0
题目大意
给出一系列课程代码以及选择每门课程的学生编号,输出前来查询的学生的所有选修课程;
2,思路
以学生的编号作为key建立一个map<string, vector<int> > data;,在接受每门课程的选修情况时,按照姓名,将当前课程加入该学生的选课列表中data[name].push_back(course)。每接受一个查询学生的名称,就将此名称对应的课程进行排序,并输出相关信息;
注意
- 此做法较为简单直接,但占用空间可能较大。
- 若出现超时的情况,注意使用scanf/printf处理数据的输入输出;
3,代码
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
bool cmp1(int a, int b){
return a < b;
}
int main(){
//#ifdef ONLINE_JUDGE
//#else
// freopen("1.txt", "r", stdin);
//#endif
int n, k; //n查询选课的人数 k课程数目
scanf("%d%d", &n, &k);
map<string, vector<int> > data;
string name;
name.resize(4);
int course, num; //course课程编号 num选课人数
for(int i = 0; i < k; i++){
scanf("%d%d", &course, &num);
for(int j = 0; j < num; j++){
scanf("%s", &name[0]);
data[name].push_back(course);
}
}
for(int i = 0; i < n; i++){
scanf("%s", &name[0]);
cout<<name;
printf(" %d", data[name].size());
sort(data[name].begin(), data[name].end(), cmp1); //按照课程代码从小到大排序
for(auto it = data[name].begin(); it != data[name].end(); it++){
printf(" %d", *it);
}
printf("\n");
}
return 0;
}