#P1245. Programmer, Rank Thyself

Programmer, Rank Thyself

题目名称:编程竞赛排名系统

问题描述

你需要实现一个编程竞赛的排名系统,其规则与实际编程竞赛使用的排名方式相同。


输入格式

输入文件包含若干组竞赛数据,每组数据以数字 0 结尾表示输入结束。
每组竞赛数据的格式如下:

  1. 第一行:一个正整数 c1 ≤ c ≤ 20),表示参赛队伍的数量。
  2. 接下来的 c:每行描述一支队伍的信息,包括:
    • 队伍名称:由 1 到 10 个字母组成(区分大小写),同一竞赛内队伍名称唯一。
    • 7 个解题时间:非负整数(0 ≤ time ≤ 500),表示解决每道题目所用的时间(0 表示未解决)。

排名规则

  1. 主要排序依据(按优先级依次比较):

    • 解题数量:解决的问题越多,排名越高。
    • 总时间:若解题数量相同,总时间(所有已解题目的时间之和)越少,排名越高。
    • 几何平均时间:若总时间相同,计算已解决题目的几何平均数(定义见下文),数值越小排名越高。
    • 队伍名称:若以上均相同,按名称的字典序(区分大小写)排列。
  2. 几何平均数计算

    • 如果所有时间为 0,则几何平均数为 0
    • 否则,对非零时间 t₁, t₂, ..., tₙ,计算公式为:
    $$\text{几何平均数} = \exp\left(\frac{\ln t₁ + \ln t₂ + \cdots + \ln tₙ}{n}\right) $$

    其中 exp 为自然指数函数,ln 为自然对数。计算结果需四舍五入为整数(如 26.4 → 2626.5 → 27)。

  3. 排名分配

    • 排名数字为 1 + 前面严格优于当前队伍的队伍数,允许并列(例如 01, 01, 03)。

输出格式

对每组竞赛数据,输出一个排名表格,格式如下:

CONTEST <竞赛编号>
<排名> <队伍名称> <解题数> <总时间> <几何平均> <7个原始时间>

字段要求

  • 对齐方式
    • 队伍名称:左对齐,固定宽度 10(不足补空格)。
    • 其他字段:右对齐,宽度固定:
      • 排名:2 位(如 01)。
      • 解题数:2 位。
      • 总时间:4 位。
      • 几何平均:3 位。
      • 每个解题时间:3 位。
  • 空格分隔:字段间用空格分隔,行末无多余空格。

示例输入与输出

输入

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