1047 Student List for Course (25分)[排序][字符串加密解密]

By Jalan

题干

浙大4w人2500课,给学生的课表输出课的学生表,说实话刷PTA经常看到这个4w2500…对比一下人数确实可能我校这辈子想超过浙大希望是很渺茫了,不过说回来不知道浙大同学选课会不会比我们还难受…

输入条件

第一行2个数,一个是学生数N[0,40000],一个是课程数K[0,2500]
接下来有N行每行是人的名称(三位大写字母加一位数字组成) 这个人的课程数C[0,20] 然后是空格分隔的C门课
课程编号是1-K

输出条件

按课程编号升序打印课程编号,空格,课程人数,\n,参与的人\n.

题解

第一次

思路

人名是固定的三位大写字母加一个数字的形式,因此可以把人名加密成一个int(262626*10)
根据课程创建一个链表,把人往进插就行.

预期时间复杂度

n档,实际比n大点

编写用时

38分钟

代码

CPP
#include<cstdio>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;
typedef struct node{
    vector<int> list;
}node;
int code(char *name){//加密人名
    int namecode=0;
    namecode+=name[0]-'A';
    namecode*=26;
    namecode+=name[1]-'A';
    namecode *= 26;
    namecode += name[2] - 'A';
    namecode *= 10;
    namecode += name[3] - '0';
    return namecode;
}
void decode(int namecode,char *name){//解密人名
    name[3]=namecode%10+'0';
    namecode/=10;
    name[2] = namecode % 26 + 'A';
    namecode /= 26;
    name[1] = namecode % 26 + 'A';
    namecode /= 26;
    name[0] = namecode + 'A';
    name[4]='\0';
}
bool cmp(int a,int b){
    return a>b?false:true;
}
int main(int argc, char const *argv[])
{
    //input&&process
    int N,K;
    scanf("%d%d",&N,&K);
    vector<node> course(K+5);
    for (int i = 0; i < N; i++)
    {
        char name[5];
        int nameCode=0;
        int courseNumber;
        scanf("%s",name);
        nameCode=code(name);
        scanf("%d",&courseNumber);
        for (int j = 0; j < courseNumber; j++)
        {
            int temporaryCourse;
            scanf("%d",&temporaryCourse);
            course[temporaryCourse].list.push_back(nameCode);
        }
    }
    
    //output
    for (int i = 1; i <= K; i++)
    {
        printf("%d %d\n",i,course[i].list.size());
        sort(course[i].list.begin(), course[i].list.end(),cmp);
        for (int j = 0; j < course[i].list.size(); j++)
        {
            char name[5];
            decode(course[i].list[j],name);
            printf("%s\n",name);
        }
    }
    
    return 0;
}

运行用时

运行用时

结尾

看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值