解析 World Football Cup 问题及其 Python 实现

问题描述

本文讨论一道关于足球锦标赛排名规则的问题,来自 Berland 足球协会对世界足球规则的调整。题目要求对给定的比赛数据进行计算,并输出能进入淘汰赛阶段的球队列表。以下是规则详细描述。

题目规则

输入格式:

  1. 第一行包含一个整数 n(1 ≤ n ≤ 50),表示参加比赛的队伍数量(保证为偶数)。

  2. 接下来的 n 行,每行包含一个队伍的名字。名字由大小写英文字母组成,长度不超过 30 个字符。

  3. 接下来的 n * (n - 1) / 2 行,描述了比赛结果,格式为:

    复制代码
    team1-team2 score1:score2
    • team1 和 team2 是两个队伍的名字。
    • score1 和 score2 分别是两队的进球数。

规则说明:

  1. 获胜队伍得 3 分,平局双方各得 1 分,失败队伍得 0 分。
  2. 排名规则:
    • 积分高者优先。
    • 如果积分相同,则净胜球(score1 - score2)高者优先。
    • 如果净胜球也相同,则总进球数高者优先。
  3. 最终取前 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()

代码解析
  1. 数据结构:

    • 使用 Team 类表示每支球队,包括球队名称、积分、净胜球和总进球数。
    • 使用字典 teams 存储所有球队的统计数据。
  2. 比赛数据处理:

    • 按输入格式解析每场比赛的比分,更新对应球队的统计信息。
  3. 排序规则:

    • 使用 Python 的 sorted 方法,根据积分、净胜球和总进球数进行多级排序。
    • 对排名靠前的球队再按字典序排序。
  4. 输出:

    • 打印进入淘汰赛的球队名称,每行一支球队。

测试与结果
测试用例 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 实现了足球锦标赛排名问题,重点在于对比赛规则的理解和对排名逻辑的实现。程序具有良好的扩展性,可以适应更复杂的比赛数据。如果你对本文感兴趣,欢迎在评论区交流!

相关推荐
昵称画6 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
传奇开心果编程7 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
Linux_cy7 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12037 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami7 小时前
【无标题】
开发语言·python
春弦_7 小时前
自用算法整理二
数据结构·算法·图论
CodeGL7 小时前
10、Python基础之进程和线程
开发语言·python
hetao17338378 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
TechWayfarer8 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php