1047 Student List for Course (25分)

1 题目

1047 Student List for Course (25分)
Zhejiang University has 40,000 students and provides 2,500 courses. Now given the registered course list of each student, you are supposed to output the student name lists of all the courses.

Input Specification:
Each input file contains one test case. For each case, the first line contains 2 numbers: N (≤40,000), the total number of students, and K (≤2,500), the total number of courses. Then N lines follow, each contains a student’s name (3 capital English letters plus a one-digit number), a positive number C (≤20) which is the number of courses that this student has registered, and then followed by C course numbers. For the sake of simplicity, the courses are numbered from 1 to K.

Output Specification:
For each test case, print the student name lists of all the courses in increasing order of the course numbers. For each course, first print in one line the course number and the number of registered students, separated by a space. Then output the students’ names in alphabetical order. Each name occupies a line.

Sample Input:
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

      
    
Sample Output:
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

2 解析

2.1 题意

求选每门课程的学生姓名

2.2 思路

2.2.1 思路一

用vector<\string>来直接对应学生下面与课程编号的关系,但是会导致最后一组数据超时。

2.2.2 思路二

1 用二维cha数组来存放姓名,其中char[i]表示第i名学生,vector存放每门课程的学生编号;
2 读入数据,如果某学生(编号i)选择课程j,则将该学生的编号存入课程中;
3 对于每门课程i,将course[i]按学生姓名的字典序从小到大排序没然后输出结果。

  • 大范围的数据用string很容易超时,一般用char数组来存放数据。
  • 用vector存储每门课程的编号,可以防止在极端情况下,空间超限。
  • 排序时,直接对字符串进行排序会导致大量的字符串移动,非常的耗时,可以字符串的下标代替字符串进行排序。
  • 用strcmp时,由于不同的编译环境导致其返回的值不一定是-1,0,1,因此此处strcmp的返回必须写小于0,否则没有普适性。

3 参考代码

3.1 思路一(用vector<\string>)

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>

using std::string;
using std::sort;
using std::vector;

//const int MAXN = 26*26*26*10 + 1;//三个字母加一个数字
//vector<int> student[MAXN];
vector<string> course[2550];

//int getID(char name[]){
//    int num = 0;
//    for (int i = 0; i < 3; ++i)
//    {
//        num = num * 26 + (name[i] - 'A');
//    }
//    num = num * 10 + (name[3] - '0');
//    return num;
//}

int main(int argc, char const *argv[])
{
    int N, K;
    scanf("%d%d", &N, &K);

    int courseID, couseNum;
    string name;
    for (int i = 0; i < N; ++i) {
        std::cin >> name;
        scanf("%d", &couseNum);
        for (int j = 0; j < couseNum; ++j) {
            scanf("%d", &courseID);
            course[courseID].push_back(name);
        }
    }

    for (int i = 1; i <= K; ++i) {
        printf("%d %lu\n", i, course[i].size());
        sort(course[i].begin(), course[i].end());
        for (int j = 0; j < course[i].size(); ++j) {
            std::cout << course[i][j] <<std::endl;
        }
    }
    return 0;
}

3.2 思路二(char二维数组)

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>

using std::sort;
using std::vector;

const int MAXN = 40010;
const int MAXC = 2510;
vector<int> course[MAXC];
char name[MAXN][5];

bool cmp(int a, int b){
    return strcmp(name[a],name[b]) < 0;
}

int main(int argc, char const *argv[])
{
    int N, K;
    scanf("%d%d", &N, &K);

    int courseID, couseNum, studentID;
    for (int i = 0; i < N; ++i) {
        scanf("%s %d", name[i], &couseNum);
        for (int j = 0; j < couseNum; ++j) {
            scanf("%d", &courseID);
            course[courseID].push_back(i);
        }
    }

    for (int i = 1; i <= K; ++i) {
        printf("%d %lu\n", i, course[i].size());
        sort(course[i].begin(), course[i].end(), cmp);
        for (int j = 0; j < course[i].size(); ++j) {
            printf("%s\n", name[course[i][j]]);
        }
    }
    return 0;
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页