FYJ780925 2023-07-01 14:54 采纳率: 45.5%
浏览 25
已结题

TooY0ung的学院(结构体)

TooY0ung的学院
想了半天硬是想不出来
描述

TooY0ung开了一个编程学院,面向全球不限年龄、不限物种进行招生。

也就是说,如果一只千年乌龟想来学习编程,TooY0ung也会让他入学。

已知每位学生的两个信息:所属城市、以及出生年份。

为了区别每位学生,TooY0ung需要给他们进行学号编码。

TooY0ung规定了一种12位的学号编码规则:

前6位用来记录城市编号,后6位用来表示年龄编号。

更具体地说,

1.如果城市的编号不足6位,则需要在前面补0,直至补齐6位。

2.年龄是根据同一个城市学生的年龄来进行编号1,2,3等,比如一个学员是某城市中,出生年份最早的(年龄最大的),

则他的后六位记录为1,与城市规则一致,如果不足6位则在前面用0补齐6位,那么这个学员的年龄编码就是000001。

同理,如果某学员是某城市中,出生年份第二早的,那么这个学员的年龄编码就是000002。

输入
输入包含多行,第一行输入两个数,n和m,n表示全球的城市数量,m表示学员人数。

接下来m行,每行输入两个数字,ci和yi,分别表示第i名学员的城市编号和出生年份。

数据保证所有学员的出生年份不一致。

输出
输出包含m行,每行一个12位数,表示该学员的学号。

输入样例 1

2 5
1 1995
2 1996
1 1993
1 1994
2 1992
输出样例 1

000001000003
000002000002
000001000001
000001000002
000002000001
提示

关于样例解释:

2个城市,5名学员。

城市1有三名学员:出生年份分别为1995、1993、1994。

城市2有两名学员:出生年份分别为1996、1992。

则第一名学员的年龄在城市1中排名第3,所以他的城市编号为1,年龄编号为3,分别补齐6位后,学号为:000001000003

第二名学员的年龄在城市2中排名第2,所以他的城市编号为2,年龄编号为2,分别补齐6位后,学号为:000002000002

第三名学员的年龄在城市1中排名第1,所以他的城市编号为1,年龄编号为1,分别补齐6位后,学号为:000001000001

第四名学员的年龄在城市1中排名第2,所以他的城市编号为1,年龄编号为2,分别补齐6位后,学号为:000001000002

第五名学员的年龄在城市2中排名第1,所以他的城市编号为2,年龄编号为1,分别补齐6位后,学号为:000002000001

来自TooY0ung温暖的提示:

输出保证6位,如果不足在前面补0有c语言快捷操作写法:

假设要输出的变量为int类型的a,则可以写 printf("%06d",a);

数据范围:

对于15%的数据,1<=n<=100,1<=m<=100,1<=ci<=n,1<=yi<=10^9。

对于100%的数据,1<=n<=10^5,1<=m<=10^5,1<=ci<=n,1<=yi<=10^9。

数据保证yi不重复。
有没有高人指点一下

  • 写回答

2条回答 默认 最新

  • 梦幻精灵_cq 2023-07-01 15:54
    关注

      用城市为标识分拣输入,可以把各个城市的学员出生年存入一个列表,排升序,再给出生年按序编号生成出生年码表,然后对各城市学员分别编号即可。城市码直接前缀0编码,出生年检索“出生年码表”序号前缀0,拼接两段编码即成学员学号编码。

    • python 代码运行效果截屏图片

      img

    • python 代码

    #!/sur/bin/nve python
    # coding: utf-8
    
    
    def encode(in_str):
        ''' 学号编码 '''
        in_str = in_str.split('\n')
        n, stus = list(map(int, in_str[0].split())), [[int(j) for j in i.split()] for i in in_str[1:]]
        studict = {}
    
        for (k,v) in stus:
            studict[k] = studict.get(k, []) + [v]
        
        studict = {city: {year: k+1 for k,year in enumerate(sorted(studict.get(city)))} for city in studict} # 生成解析学号编码的字典。
        #print(studict) # 查看生成的学号编码字典。
        
        for city,year in stus: # 遍历轮询编码学号。
            print(f"{city:0>6}{studict.get(city).get(year):0>6}") # 插值字符串格式化输出学号编码。
    
    
    if __name__ == '__main__':
        in_str = '''2 5
    1 1995
    2 1996
    1 1993
    1 1994
    2 1992''' # 输入字符串。
        print(f"\n输入:\n{in_str}\n\n输出:")
        encode(in_str) # 调用函数编码学号。
    
    

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月8日
  • 创建了问题 7月1日

悬赏问题

  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用
  • ¥15 基于OPENCV的人脸识别
  • ¥20 51单片机学习中的问题
  • ¥30 Windows Server 2016利用兩張網卡處理兩個不同網絡
  • ¥15 Python中knn问题
  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题