问题描述
本文讨论一道关于足球锦标赛排名规则的问题,来自 Berland 足球协会对世界足球规则的调整。题目要求对给定的比赛数据进行计算,并输出能进入淘汰赛阶段的球队列表。以下是规则详细描述。
题目规则
输入格式:
- 第一行包含一个整数
n
(1 ≤ n ≤ 50),表示参加比赛的队伍数量(保证为偶数)。 - 接下来的
n
行,每行包含一个队伍的名字。名字由大小写英文字母组成,长度不超过 30 个字符。 - 接下来的
n * (n - 1) / 2
行,描述了比赛结果,格式为:team1-team2 score1:score2
team1
和team2
是两个队伍的名字。score1
和score2
分别是两队的进球数。
规则说明:
- 获胜队伍得 3 分,平局双方各得 1 分,失败队伍得 0 分。
- 排名规则:
- 积分高者优先。
- 如果积分相同,则净胜球(
score1 - score2
)高者优先。 - 如果净胜球也相同,则总进球数高者优先。
- 最终取前
n / 2
名进入淘汰赛阶段,并按字典序输出。
输出格式:
- 输出
n / 2
行,表示进入淘汰赛的球队,按字典序排列。
示例
输入:
4
A
B
C
D
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3
输出:
A
D
输入:
2
a
A
a-A 2:1
输出:
a
Python 实现代码
以下是对该问题的 Python 实现,程序清晰地遵循题目规则,确保排名计算和输出正确。
from collections import defaultdict
class Team:
def __init__(self, name):
self.name = name
self.pts = 0 # 积分
self.diff = 0 # 净胜球
self.scored = 0 # 总进球数
def main():
# 输入处理
n = int(input().strip())
teams = {}
for _ in range(n):
name = input().strip()
teams[name] = Team(name)
for _ in range(n * (n - 1) // 2):
match = input().strip()
names, scores = match.split()
team1, team2 = names.split('-')
score1, score2 = map(int, scores.split(':'))
# 更新统计信息
teams[team1].scored += score1
teams[team2].scored += score2
teams[team1].diff += score1 - score2
teams[team2].diff += score2 - score1
if score1 > score2:
teams[team1].pts += 3
elif score1 < score2:
teams[team2].pts += 3
else:
teams[team1].pts += 1
teams[team2].pts += 1
# 排名规则
sorted_teams = sorted(
teams.values(),
key=lambda x: (x.pts, x.diff, x.scored),
reverse=True
)
# 取前 n / 2 并按字典序排序
top_teams = sorted([team.name for team in sorted_teams[:n // 2]])
# 输出结果
for name in top_teams:
print(name)
if __name__ == "__main__":
main()
代码解析
-
数据结构:
- 使用
Team
类表示每支球队,包括球队名称、积分、净胜球和总进球数。 - 使用字典
teams
存储所有球队的统计数据。
- 使用
-
比赛数据处理:
- 按输入格式解析每场比赛的比分,更新对应球队的统计信息。
-
排序规则:
- 使用 Python 的
sorted
方法,根据积分、净胜球和总进球数进行多级排序。 - 对排名靠前的球队再按字典序排序。
- 使用 Python 的
-
输出:
- 打印进入淘汰赛的球队名称,每行一支球队。
测试与结果
测试用例 1:
输入:
4
A
B
C
D
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3
输出:
A
D
测试用例 2:
输入:
2
a
A
a-A 2:1
输出:
a
算法复杂度
- 时间复杂度:
- 读取和处理比赛结果:O(n²),其中 n 为球队数量。
- 排序:O(n log n)。
- 空间复杂度:
- 存储球队信息:O(n)。
总结
本文通过 Python 实现了足球锦标赛排名问题,重点在于对比赛规则的理解和对排名逻辑的实现。程序具有良好的扩展性,可以适应更复杂的比赛数据。如果你对本文感兴趣,欢迎在评论区交流!