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不重复。
有没有高人指点一下

  用城市为标识分拣输入,可以把各个城市的学员出生年存入一个列表,排升序,再给出生年按序编号生成出生年码表,然后对各城市学员分别编号即可。城市码直接前缀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) # 调用函数编码学号。


  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7798335
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    首先,我们可以使用结构体来表示学生的城市编号和出生年份:

    typedef struct {
        int city;
        int year;
    } Student;
    

    然后,我们可以创建一个名为studentsStudent结构体数组,大小为m,用于存储所有学生的信息:

    Student students[m];
    

    接下来,我们可以使用一个循环来读取每个学生的城市编号和出生年份,并将其存储到students数组中:

    for (int i = 0; i < m; i++) {
        scanf("%d %d", &students[i].city, &students[i].year);
    }
    

    接下来,我们需要对students数组按照出生年份进行排序。这里我们可以使用快速排序算法来解决。快速排序使用了分治算法,将大问题分解成小问题。

    首先,我们需要实现一个快速排序函数quickSort,用于将students数组按照出生年份递增进行排序:

    void quickSort(Student *students, int low, int high) {
        if (low < high) {
            int i = low, j = high;
            Student pivot = students[low];
    
            while (i < j) {
                while (students[j].year >= pivot.year && i < j) {
                    j--;
                }
                if (i < j) {
                    students[i++] = students[j];
                }
    
                while (students[i].year <= pivot.year && i < j) {
                    i++;
                }
                if (i < j) {
                    students[j--] = students[i];
                }
            }
    
            students[i] = pivot;
            quickSort(students, low, i-1);
            quickSort(students, i+1, high);
        }
    }
    

    然后,我们可以调用quickSort函数对students数组进行排序:

    quickSort(students, 0, m-1);
    

    接下来,我们可以使用一个循环来生成每位学生的12位学号编码,并输出结果:

    for (int i = 0; i < m; i++) {
        int cityCode = students[i].city;
        int ageCode = i + 1;
    
        printf("%06d%06d\n", cityCode, ageCode);  // 输出保证6位不足在前面补0
    }
    

    完整代码如下:

    #include <stdio.h>
    
    typedef struct {
        int city;
        int year;
    } Student;
    
    void quickSort(Student *students, int low, int high) {
        if (low < high) {
            int i = low, j = high;
            Student pivot = students[low];
    
            while (i < j) {
                while (students[j].year >= pivot.year && i < j) {
                    j--;
                }
                if (i < j) {
                    students[i++] = students[j];
                }
    
                while (students[i].year <= pivot.year && i < j) {
                    i++;
                }
                if (i < j) {
                    students[j--] = students[i];
                }
            }
    
            students[i] = pivot;
            quickSort(students, low, i-1);
            quickSort(students, i+1, high);
        }
    }
    
    int main() {
        int n, m;
        scanf("%d %d", &n, &m);
    
        Student students[m];
    
        for (int i = 0; i < m; i++) {
            scanf("%d %d", &students[i].city, &students[i].year);
        }
    
        quickSort(students, 0, m-1);
    
        for (int i = 0; i < m; i++) {
            int cityCode = students[i].city;
            int ageCode = i + 1;
    
            printf("%06d%06d\n", cityCode, ageCode);
        }
    
        return 0;
    }
    

    这样,我们就可以根据学生的城市编号和出生年份生成对应的学号编码,并按要求输出结果。

    希望这个解决方案对你有帮助!如果有任何问题,请随时问我。