Skip to content

E25301: 生日相同

data structure/implementation, http://cs101.openjudge.cn/practice/25301

在一个有210人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生日期。试找出所有生日相同的学生。

输入

第一行为整数n,表示有n个学生,n < 100 。 此后每行包含一个字符串和两个整数,分别表示学生的学号(字符串长度小于10)和出生月(1 <= m <= 12)日(1 <= d <= 31)。 学号、月、日之间用一个空格凤娥。

输出

对每组生日相同的学生,输出一行, 其中前两个数字表示月和日,后面跟着所有在当天出生的学生的学号,数字、学号之间都用一个空格分隔。 对所有的输出,要求按照日期从前到后的顺序输出。 对生日相同的学号,按输入的顺序输出。

样例输入

5
00508192 3 2
00508153 4 5
00508172 3 2
00508023 4 5
00509122 4 5

样例输出

3 2 00508192 00508172
4 5 00508153 00508023 00509122

来源:2016fall-cs101

用多维数组可以很直观地解出来(这里相当于是三维数组)

python
birthday_list = [[[] for j in range(32)] for i in range(13)]
for _ in range(int(input())):
    student_id,m,d = input().split()
    m = int(m); d = int(d)
    birthday_list[m][d].append(student_id)
for month in range(1,13):
    for day in range(1,32):
        if len(birthday_list[month][day]) > 1:
            print(month, day, *birthday_list[month][day])
python
'''
利用字典记录每个日期里的人的生日的学号,然后遍历一遍所有日期,把同一天生日的人输出。
或者根据日期进行排序,然后找出同一天生日的学号。

黄丽明 北京大学
implemented by 1400015420 
'''
n=int(input())
a=[]
for i in range(n):
    a.append([i for i in input().split()])
c={}
for i in range(n):
    if (int(a[i][1]),int(a[i][2])) in c:
        c[(int(a[i][1]),int(a[i][2]))].append(a[i][0])
    else : 
        c[(int(a[i][1]),int(a[i][2]))]=[a[i][0]]

b=list(c.keys())
b.sort()
for i in b:
    if len(c[i])>1:

        print(i[0],i[1],end=' ')
        re=''
        for j in c[i]:
            re+=j+' '
        print(re[:-1])

2022fall-cs101,万其委,物理学院。

构建(月份m,日期d)到一个正整数z 的一对一的函数映射z=(m-1)*31+d,方便排序与整理生日相同的人。

python
n=int(input())
date=[[] for i in range(400)]
for i in range(n):
    s,m,d=input().split()
    m=int(m)
    d=int(d)
    date[(m-1)*31+d].append(s)
for i in range(1,400):
    if len(date[i])>=2:
        print("{} {}".format(i//31+1,i%31),end=" ")
        print(' '.join(date[i]))
python
n = int(input())
info = [[] for i in range(1231)]
for i in range(n):
    stu, m, d = [x for x in input().split()]
    a = int(m)*100 + int(d)
    info[a].append(stu)
for j in range(1231):
    if len(info[j]) > 1:
        number = ''
        for _ in info[j]:
            number += _ + ' '
        print(int(j/100), int(j%100), number)

2022fall-cs101,郭祺,物理学院。

核心是第七行,用 get 和空格来针对同一键对应多个值。(可能说得不准确,但意思是那样)。

python
n = int(input())
info = {}
for i in range(n):
    id, m, d = map(str, input().split())
    m = int(m)
    d = int(d)
    info[(m,d)] = info.get((m,d),'') + ' ' + id 
a = list(info.items())
a.sort()
for i,j in a:
    m,d = i
    if len(j.split()) > 1:
        print(str(m) + ' ' + str(d) + j)