题目大意
给一些学生和这些学生选的课,要求输出每个课有多少人选,并输出选了这门课的学生名
输入
每组包含一个测试用例。
每个用例的第一行是两个数
N
≤
40000
N\leq40000
N≤40000表示学生总数,
K
≤
2500
K\leq2500
K≤2500表示课程总数。
之后有
N
N
N行表示
N
N
N个学生的选课情况,格式为name c c1 c2 ...
,name是学生的名字,c是学生选的课程数量,后面跟着c个课程的编号(
1
1
1~
K
K
K)
输出
对每个用例,按课程编号升序输出每个课的学生选修情况
对每个课程,先输出课程编号和选修的学生人数
然后每行以字典序输出学生的名字
样例输入
10 5
ZOE1 2 4 5
ANN0 3 5 2 1
BOB5 5 3 4 2 1 5
JOE4 1 2
JAY9 4 1 2 5 4
FRA8 3 4 2 5
DON2 2 4 5
AMY7 1 5
KAT3 3 5 4 2
LOR6 4 2 4 1 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
解析
大致思路就是用python的list保存每个课程的学生名字,然后按要求输出就行。
但是python会在最后一个测试点超时。
所以用C++就可以AC
python:
# -*- coding: utf-8 -*-
# @Time : 2019/6/6 18:09
# @Author : ValarMorghulis
# @File : 1047.py
def solve():
n, k = map(int, input().split())
ans = [[] for i in range(k)]
for i in range(n):
line = input().split()
name, courses = line[0], list(map(int, line[1:]))
for j in range(1, courses[0] + 1):
ans[courses[j] - 1].append(name)
for i in range(k):
print("%d %d" % (i+1, len(ans[i])))
ans[i] = sorted(ans[i], key=lambda x: x)
for j in ans[i]:
print(j)
if __name__ == "__main__":
solve()
C++:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
#define inf 0xffffffff
using namespace std;
char name[40010][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> courses[2505];
for(int i=0; i<n; i++)
{
int c;
scanf("%s%d", name[i], &c);
for(int j=0; j<c; j++)
{
int t;
scanf("%d", &t);
courses[t].push_back(i);
}
}
for(int i=1; i<=k; i++)
{
printf("%d %d\n", i, courses[i].size());
sort(courses[i].begin(), courses[i].end(), cmp);
for(int j=0; j<courses[i].size(); j++)
printf("%s\n", name[courses[i][j]]);
}
return 0;
}