P7614 [COCI2011-2012#2] NAJBOLJIH 5
题目描述
给定 8 8 8 个数字 X 1 , X 2 , . . . , X 8 X_1,X_2,...,X_8 X1,X2,...,X8,从中选出 5 5 5 个数字,使得这 5 5 5 个数字的总和最大。输出这 5 5 5 个数字的和以及它们的编号。 X i X_i Xi 的编号为 i i i。
输入格式
输入共 8 8 8 行,第 i i i 行包含一个正整数 X i X_i Xi。保证所有 X i X_i Xi 互不相同。
输出格式
输出共两行。
第一行包含一个整数,表示最大的总和。
第二行包含 5 5 5 个整数,表示 5 5 5 个数的编号,按升序排序。
样例 #1
样例输入 #1
20
30
50
48
33
66
0
64
样例输出 #1
261
3 4 5 6 8
样例 #2
样例输入 #2
20
0
50
80
77
110
56
48
样例输出 #2
373
3 4 5 6 7
样例 #3
样例输入 #3
20
30
50
80
110
11
0
85
样例输出 #3
355
2 3 4 5 8
提示
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ X i ≤ 150 1 \le X_i \le 150 1≤Xi≤150。
【说明】
本题分值按 COCI 原题设置,满分 50 50 50。
题目译自 COCI2011-2012 CONTEST #2 T1 NAJBOLJIH 5。
代码实现
由于需要对输入的 8 个数字取最大的 5 个数字,计算其总和并以升序输出其编号,故在输入时将每个输入的数字与其编号绑定(元组形式存储),并直接进行排序取 top 5。
- 使用 sorted() 函数先根据数字大小进行排序,取出最大的 5 个数字
- 对这 5 个数字进行编号的升序排列
- 统计 5 个数字的总和
- 依次输出这些数字的编号
top5 = sorted(sorted([(i + 1, int(input().strip())) for i in range(8)], key=lambda x: -x[1])[:5], key=lambda x: x[0])
print(sum(i[1] for i in top5))
print(" ".join([str(i[0]) for i in top5]))