题目大意
给一些组,每个组里面有一些学生,学生有id,分数。要求所有学生的总排名,学生属于哪个组,这些学生在组里的排名。
输入
每组包含一个测试用例,第一行输出组的数量 N N N( ≤ 100 \leq100 ≤100),之后会输出每个组。每个组的第一行是这个组的学生数量 K K K( ≤ 300 \leq 300 ≤300),之后跟着 K K K行,每行是学生的id(13位数)和这个学生的总分
输出
对每个例子,先输出学生的总数,然后输出学生的排名信息,格式如下
registration_number final_rank location_number local_rank
registration_number
是学生的id,final_rank
是学生总排名,location_number
是学生属于的组号,local_rank
是学生在组里的排名。组的编号从
1
1
1~
N
N
N,以学生总分非递增输出,如果有多个学生的分数相同,就按照id非递减输出
样例输入
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
`
样例输出
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
解析
简单的排序,但是由于数据量的问题,python需要小心处理
def main():
n = int(input())
tests = []
count = 0
for x in range(n):
k = int(input())
count += k
temp = []
for i in range(k):
line = input().split(" ")
unit = [line[0], -1, str(x + 1), -1, int(line[1])]
temp.append(unit)
temp = sorted(temp, key=lambda i: (-i[4], i[0]))
temp[0][3] = '1'
for i in range(1, k):
if temp[i][4] != temp[i - 1][4]:
temp[i][3] = str(i + 1)
else:
temp[i][3] = temp[i - 1][3]
tests += temp
tests = sorted(tests, key=lambda x: (-x[4], x[0]))
tests[0][1] = '1'
print(count)
print(' '.join(tests[0][:-1]))
for i in range(1, count):
if tests[i][4] != tests[i - 1][4]:
tests[i][1] = str(i + 1)
else:
tests[i][1] = tests[i - 1][1]
print(' '.join(tests[i][:-1]))
if __name__ == "__main__":
main()