测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A30290. 学生课表

填空题 困难

题目描述

学生课表

题目描述

某大学有 40000 名学生,开了 2500 门课。给定所有课程的选课名单,你的任务是为每一位前来查询的学生打印其选课的课表。

时间限制: 2000        内存限制: 262144

输入

输入第一行给出 2 个正整数: 

N(≤ 40000) 为查询课表的学生人数; K(≤ 2500) 为课程总数。

下面给出每门课的选课名单(课程从 1 到 K 编号) ,格式为: 课程编号选课人数学生姓名 1 学生姓名 2 ... 其中 选课人数 不超过 200 人。学生姓名由 3 个英文大写字母和 1 位数字组成。最后一行给出 N 个前来查询的学生姓名。一行中的数字和姓名都以空格分隔。

输出

对每个前来查询的学生,在一行中输出学生的姓名、 选课门数、 升序输出的课程编号,其间以 1 个空格分隔。行首尾不得有多余空格。

样例输入

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

样例输出

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

参考答案

#include<bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n>>m; map<string,vector<int>> mp; for(int i = 0;i < m;i++){ int num,ks; cin>>num>>ks; for(int j = 0;j < ks;j++){ string s; cin>>s; mp[s].push_back(num); } } for(int i = 0;i < n;i++){ string s; cin>>s; sort(mp[s].begin(),mp[s].end()); cout<<s<<" "<<mp[s].size(); for(int j = 0;j < mp[s].size();j++){ cout<<" "<<mp[s][j]; } cout<<endl; } }

答案解析

//方法二

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <cstring>

#include <vector>

using namespace std;

int mhash(char * name) {

return (name[0] - 'A') * 26 * 26 * 10 + (name[1] - 'A') * 26 * 10 + (name[2] - 'A') * 10 + name[3] - '0';

}

vector<int> stu[26 * 26 * 26 * 10 + 1];

int main() {

int N, K;

scanf("%d %d", &N, &K);

int i, j;

char name[5];

int id, n;

for(i = 0; i < K; i++) {

scanf("%d %d", &id, &n);

for(j = 0; j < n; j++) {

scanf("%s", name);

int h = mhash(name);

stu[h].push_back(id);

}

}

for(i = 0; i < N; i++) {

scanf("%s", name);

int h = mhash(name);

sort(stu[h].begin(), stu[h].end());

int s = stu[h].size();

printf("%s %d", name, s);

for(j = 0; j < s; j++) {

printf(" %d", stu[h][j]);

}

printf("\n");

}

return 0;

}

上一题 下一题