#P1918. Ranking List
Ranking List
描述
背景
我们就知道会缺些东西。我们刚刚发现,对于这次编程竞赛,我们没有一个工具来帮助生成排名列表。而且如果我们尝试手动创建排名列表,你们可能要等到周日才能得到结果。所以,拜托在这里帮帮我们,好吗?
问题
你的任务是编写一个程序,来确定一场编程竞赛的排名列表。你会得到一份参赛队伍的名单,以及一个日志文件,该文件描述了各队伍提交的所有解决方案。
这次编程竞赛的计分基于以下一系列规则:竞赛评委全权负责判定所提交代码运行结果的正确性。竞赛的获胜者由竞赛评委和竞赛总监共同确定。竞赛评委有权对意外事件和情况进行调整或裁决。各队伍将根据正确解决的问题总数进行排名。为了确定奖项归属,或者在确定参加 ACM 竞赛的入围队伍时,解决问题数量相同的队伍将按照总用时最少的原则进行排名。如果出现平局的情况,则会考虑每个已解决问题的最少尝试次数。首先比较尝试次数最多的问题的提交次数。总用时是每个已解决问题所消耗时间的总和。对于一个已解决的问题,所消耗的时间是从竞赛开始到提交被接受的代码所经过的时间,再加上针对该问题的每次被拒绝的提交(无论提交时间)都要额外加上 20 分钟的罚时。对于未解决的问题,不计算消耗时间。
我们确信你了解所有这些规则。然而,我们认为第二条规则中用于解决平局情况的规定有点模糊,所以我们不希望你的程序实现这样的处理过程。相反,如果有两个或更多的队伍在正确解决问题的总数和总用时上都相同,就给这些队伍赋予相同的排名,并按字母顺序列出。他们的相对排名将由竞赛总监根据每个已解决问题的尝试次数或最早解决的问题来确定。 因为我们希望队伍的排名 表示有 支队伍表现得更好,所以在平局情况下我们需要调整排名数字。例如,如果两支表现最好的队伍解决问题的数量和总用时都相同,他们都将获得第 1 名,而下一支队伍将被赋予第 3 名。在这个例子中,你的程序不会给任何队伍赋予第 2 名。
我们对第三条规则还有一个补充:在同一队伍提交的正确解决方案被接受之后,再提交的错误解决方案将不会受到罚时。 输入
第一行包含测试用例的数量。 对于每个测试用例,第一行是队伍的数量,接下来的 行是各队伍(唯一)的名称。队伍名称是一个长度最多为 8 的单词,仅包含字母和数字。为了方便你处理,队伍是按字母顺序列出的。下一行包含问题的数量 和提交的解决方案的数量 。接下来的 行中的每一行都描述了一个这样的解决方案,格式为 “问题编号 时间 正确性 队伍名称”,其中 1≤问题编号 ≤k是问题的编号,0≤时间 <300是自竞赛开始以来经过的分钟数,正确性要么是 “Yes”(正确)要么是 “No”(错误),队伍名称是提交该解决方案的队伍的名称。你可以假设日志文件中的行是按时间排序的。 输出 对于每个测试用例,打印一个包含所有参赛队伍的排名列表。格式为 “排名。队伍名称 解决问题数 总用时”,其中排名是队伍的排名,队伍名称是队伍的名字,解决问题数是正确解决的问题数量,总用时是总的用时。除了用单个空格分隔这四个字段外,通过使用宽度为 2 的排名字段、宽度为 8 的队伍名称字段、宽度为 1 的解决问题数字段和宽度为 4 的总用时间字段(队伍名称左对齐,数字右对齐,参见示例输出),使表格看起来美观。每个测试用例的输出最后都有一个空行。
输入数据 1
2 10 Team1
Team2
Team3
Team4
Team5
Team6
Team7
Team8
Team9
slowTeam 8 14 1 18 Yes Team4
1 57 Yes Team2
1 87 Yes Team3
1 101 Yes Team1
2 103 Yes Team5
2 120 Yes Team6
6 141 Yes Team7
1 147 No Team1
7 156 Yes Team2
5 167 Yes Team8
2 167 Yes Team9
5 170 No Team4
5 175 Yes Team4
1 234 No slowTeam 1
Team1 8 0
输出数据 1
Team2 2 213
Team4 2 213
Team3 1 87
Team1 1 101
Team5 1 103
Team6 1 120
Team7 1 141
Team8 1 167
Team9 1 167
slowTeam 0 0 Team1 0 0