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 代码运行效果截屏图片
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) # 调用函数编码学号。
解决方案:
首先,我们可以使用结构体来表示学生的城市编号和出生年份:
typedef struct {
int city;
int year;
} Student;
然后,我们可以创建一个名为students
的Student
结构体数组,大小为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;
}
这样,我们就可以根据学生的城市编号和出生年份生成对应的学号编码,并按要求输出结果。
希望这个解决方案对你有帮助!如果有任何问题,请随时问我。