题目链接 我的github
给出学生的C、M、E的成绩,要求出其中某些学生的最好排名(C、M、E、A,A是C、M、E的平均值,最好排名是指在C、M、E、A这四个排名中最小的那个)
每组包含一个测试用例,每个用例的第一行是2个数 N N N和 M M M( ≤ 2000 \leq 2000 ≤2000),分别表示学生的总数和查询最好排名的学生数。接着 N N N行,每一行是学生的ID(长度为6的字符串),然后跟着3个整数(范围是 [ 0 , 100 ] [0, 100] [0,100])表示学生的C、M、E成绩。之后又有 M M M行,每行是一个学生的ID
对要查询的 M M M个学生在一行中输出他的最好排名和最好排名是哪一门(C、M、E、A),如果最好排名不止一门就按照A>C>M>E的优先级输出最高的那一门,如果要查询的学生ID不在给的 N N N个学生之中,就输出N/A
5 6 310101 98 85 88 310102 70 95 88 310103 82 87 94 310104 91 91 91 310105 85 90 90 310101 310102 310103 310104 310105 999999
1 C 1 M 1 E 1 A 3 A N/A
按照优先级排序就完事了,注意A的成绩是其他三门成绩的平均值并四舍五入
class student: def __init__(self, C, M, E, ID): self.grade = [round((C + M + E) / 3), C, M, E] self.id = ID self.rank = [-1, -1, -1, -1] def solve(): line = input().split(" ") n = int(line[0]) m = int(line[1]) students = {} for i in range(n): line = input().split(" ") ID = line[0] C = int(line[1]) M = int(line[2]) E = int(line[3]) s = student(C, M, E, ID) students[ID] = s for x in range(4): p = sorted(students.values(), key=lambda i: -i.grade[x]) p[0].rank[x] = 1 for i in range(1, n): p[i].rank[x] = i + 1 if p[i].grade[x] == p[i - 1].grade[x]: p[i].rank[x] = p[i - 1].rank[x] for i in range(m): line = input() try: unit = students[line] temp = zip(unit.rank, ['0A', '1C', '2M', '3E']) temp = sorted(temp) print(str(min(unit.rank)), temp[0][1][1]) except: print('N/A') if __name__ == "__main__": solve()