PAT1 1047 Student List for Course

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LSC_333/article/details/91129013

题目链接
我的github

题目大意

给一些学生和这些学生选的课,要求输出每个课有多少人选,并输出选了这门课的学生名

输入

每组包含一个测试用例。
每个用例的第一行是两个数 N 40000 N\leq40000 表示学生总数, K 2500 K\leq2500 表示课程总数。
之后有 N N 行表示 N N 个学生的选课情况,格式为name c c1 c2 ...,name是学生的名字,c是学生选的课程数量,后面跟着c个课程的编号( 1 1 ~ 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;
}

猜你喜欢

转载自blog.csdn.net/LSC_333/article/details/91129013