PAT A1039&&A1047 vector

A1039

  • 题目大意:

    • 给出c个课程代号,和每个课程对应的选课学生名字(4位char)。然后再给出k个学生名字,要求按照顺序输出每个学生的选课数和已选课程代号,课程代号升序表示。
  • 注意点

    • 学生名字对应选课代号可以用map<string,vector< Int> >,但本题数据量很大,不能用map,只能把学生名字转化成id,用hash存储。(对于本题来说,vector和map也只有这点差别)
    • 注意字母转化成int时的算法:n=n*26+str[i]-‘A’.
  • 代码

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

const int maxn = 26 * 26 * 26 * 10 + 10;
vector<int>Stu[maxn];

int changeToint(char name[])
{
    int n = 0;
    for(int i = 0; i < 3; i++)
        n = n * 26 + name[i] - 'A';
    n = n * 10 + name[3] - '0';

    return n;
}

int main()
{
    int N, K;
    char name[5];
    cin >> N >> K;


    for(int i = 0; i < K; i++)
    {
        int course, s;   //t:course s:student's count
        scanf("%d%d", &course, &s);

        for(int j = 0; j < s; j++)
        {
            scanf("%s", name);
            int id = changeToint(name);
            Stu[id].push_back(course);
        }
    }

    for(int i = 0; i < N; i++)
    {
        scanf("%s", name);
        printf("%s", name);
        int id = changeToint(name);
        printf(" %d", Stu[id].size());

        sort(Stu[id].begin(), Stu[id].end());
        for(int j = 0; j < Stu[id].size(); j++)
            printf(" %d", Stu[id][j]);
        printf("\n");
    }


    return 0;
}

A1047

  • 题目大意

    • 和上题相反,给出每个学生选的课,让你根据课程编号依次输出选这门课的学生名字,按字母序排列。
  • 注意点

    • 因为题目信息是按照学生名字给出的,则可以把学生设置成id号,另建char数组记录学生名字和id对应。
    • 设置vector< int >course_stu [maxn] 数组,数组下标表示课程id,容器内部表示选当前这门课的学生id。
    • 题目要求按照字母序排列,可以自定义cmp函数,交换容器内部元素的位次,而不改变id和name的对应规则。
  • 代码

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

const int maxc = 2600;
const int maxs = 40010;
vector<int>courseStu[maxc];
char name[maxs][5];

bool cmp(int a, int b)
{
    return strcmp(name[a], name[b]) < 0;
}
int main()
{
    int N, K;   //N:学生数 K:课程数
    cin >> N >> K;

    for(int i = 0; i < N; i++)
    {
        scanf("%s", name[i]);   //把学生名字存到数组里
        int c;
        scanf("%d", &c);
        for(int j = 0; j < c; j++)
        {
            int tc; //课程代号
            scanf("%d", &tc);
            courseStu[tc].push_back(i);
        }

    }

    for(int i = 1; i <= K; i++)
    {
        printf("%d %d\n", i, courseStu[i].size());
        sort(courseStu[i].begin(), courseStu[i].end(), cmp);

        for(int j = 0; j < courseStu[i].size(); j++)
        {
            printf("%s", name[courseStu[i][j]]);
            printf("\n");
        }
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值