#P1245. Programmer, Rank Thyself
Programmer, Rank Thyself
题目名称:编程竞赛排名系统
问题描述
你需要实现一个编程竞赛的排名系统,其规则与实际编程竞赛使用的排名方式相同。
输入格式
输入文件包含若干组竞赛数据,每组数据以数字 0
结尾表示输入结束。
每组竞赛数据的格式如下:
- 第一行:一个正整数
c
(1 ≤ c ≤ 20
),表示参赛队伍的数量。 - 接下来的
c
行:每行描述一支队伍的信息,包括:- 队伍名称:由 1 到 10 个字母组成(区分大小写),同一竞赛内队伍名称唯一。
- 7 个解题时间:非负整数(
0 ≤ time ≤ 500
),表示解决每道题目所用的时间(0
表示未解决)。
排名规则
-
主要排序依据(按优先级依次比较):
- 解题数量:解决的问题越多,排名越高。
- 总时间:若解题数量相同,总时间(所有已解题目的时间之和)越少,排名越高。
- 几何平均时间:若总时间相同,计算已解决题目的几何平均数(定义见下文),数值越小排名越高。
- 队伍名称:若以上均相同,按名称的字典序(区分大小写)排列。
-
几何平均数计算:
- 如果所有时间为
0
,则几何平均数为0
。 - 否则,对非零时间
t₁, t₂, ..., tₙ
,计算公式为:
其中
exp
为自然指数函数,ln
为自然对数。计算结果需四舍五入为整数(如26.4 → 26
,26.5 → 27
)。 - 如果所有时间为
-
排名分配:
- 排名数字为
1 + 前面严格优于当前队伍的队伍数
,允许并列(例如01, 01, 03
)。
- 排名数字为
输出格式
对每组竞赛数据,输出一个排名表格,格式如下:
CONTEST <竞赛编号>
<排名> <队伍名称> <解题数> <总时间> <几何平均> <7个原始时间>
字段要求:
- 对齐方式:
- 队伍名称:左对齐,固定宽度 10(不足补空格)。
- 其他字段:右对齐,宽度固定:
- 排名:2 位(如
01
)。 - 解题数:2 位。
- 总时间:4 位。
- 几何平均:3 位。
- 每个解题时间:3 位。
- 排名:2 位(如
- 空格分隔:字段间用空格分隔,行末无多余空格。
示例输入与输出
输入
1
Plutonians 123 234 345 456 167 278 389
0
4
Xap 0 0 0 0 0 0 0
Foo 20 30 0 50 40 0 10
Bar 0 50 20 0 10 40 30
Baz 0 0 0 0 0 0 0
0
3
Venus 213 0 0 57 0 0 0
Neptune 0 0 0 117 153 0 0
Mars 0 150 0 0 0 0 120
0
输出
CONTEST 1
01 Plutonians 7 1992 261 123 234 345 456 167 278 389
CONTEST 2
01 Bar 5 150 26 0 50 20 0 10 40 30
01 Foo 5 150 26 20 30 0 50 40 0 10
03 Baz 0 0 0 0 0 0 0 0 0 0
03 Xap 0 0 0 0 0 0 0 0 0 0
CONTEST 3
01 Venus 2 270 110 213 0 0 57 0 0 0
02 Mars 2 270 134 0 150 0 0 0 0 120
02 Neptune 2 270 134 0 0 0 117 153 0 0