美文网首页
A1039 Course List for Student (2

A1039 Course List for Student (2

作者: km15 | 来源:发表于2020-02-15 12:49 被阅读0次

/*
题意:
1、第一行给出两个数字,第一个,学生查询课程的人数;第二个,总的课程数
2、第二行给出课程号,以及注册这门课的人数
3、第三行给出学生的名字
4、最后是N个来查询

输出:
1、输出学生的名字,学生参加的课程数,课程号(递增排序)

解题:用vector无疑了,怎么用
1、用向量数组,名字散列成hash表下标,从而把成绩压入向量中

learn && wrong:
1、解题的思路不错,(哈希+向量数组)
2、用Map会超时,用了向量数组,脑海要有向量数组的定义
3、用cin和cout会超时
4、用二维数组会超时,所以用vector来减少空间量
5、vector也可以用sort函数的
*/

#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 40010;    //总人数
const int M = 26 * 26 * 26 * 10 + 1;    //由星美你散列成的数字上界
vector<int> selectcourse[M];    //每个学生选课的记录

int getid(char str[]) {
    int id = 0;
    for (int i = 0;i < 3;++i) {
        id = id * 26 + (str[i] - 'A');
    }
    id = id * 10 + (str[3] - '0');
    return id;
}

int main()
{
    char name[5];
    int n, k;
    scanf("%d%d", &n, &k);    //查询学生人数以及课程数
    for (int i = 0;i < k;++i) {
        int courses, x;
        scanf("%d%d", &courses, &x);  //输入每门课程数以及选课人数
        for (int j = 0;j < x;++j) {
            cin>>name;   //输入选课学生姓名
            int id = getid(name);   //将姓名散列为一个整数作编号
            selectcourse[id].push_back(courses);    //将课程编号压入每一个学生选择中
        }
    }

    for (int i = 0;i < n;++i) {   //n个查询
        cin>>name;   //学生姓名
        int id = getid(name);   //获得学生编号
        sort(selectcourse[id].begin(), selectcourse[id].end());  //从小到大排序
        printf("%s %d", name, selectcourse[id].size());   //姓名,选课数
        for (int j = 0;j < selectcourse[id].size();++j) {   //!!!下标错了
            printf(" %d", selectcourse[id][j]);
        }
        printf("\n");
    }

    return 0;
}

相关文章

网友评论

      本文标题:A1039 Course List for Student (2

      本文链接:https://www.haomeiwen.com/subject/jgsefhtx.html