【问题标题】:How to decide if a league table is admissible?如何确定是否可以接受排行榜?
【发布时间】:2019-11-04 02:45:25
【问题描述】:

让我们考虑一个由 n 支球队组成的联赛,其中每支球队与所有其他球队交手两次,并产生三种可能的结果:赢、输或平。胜得 2 分,平 1 分,负 0 分。我们要决定是否可以接受排行榜。

我正在尝试实现一个多项式时间算法来解决这个问题。我曾想过使用网络流技术(如 Kleinberg 和 Tardos 的“算法设计”的第 7 章),但无法提出任何具体的建议。

理想的解决方案如下所示

    IsAdmissible
    Input: Final league table
    {
         ...
    }
    Output: TRUE if there's a combination of matches resulting in given table
            FALSE otherwise

【问题讨论】:

  • 什么是可接受的联赛?
  • 一个可接受的排名表是一个有其结果组合的表。例如,如果我们有 20 支球队,那么一支球队的最大积分是 114 分,因此不允许有一支球队获得 115 分的联赛表。
  • 请将问题规范编辑到问题中,而不是作为 cmets。包括所有规格。还有其他表格列需要考虑吗?
  • 为什么是 114?胜利值 2 分还是 3 分?

标签: algorithm max-flow


【解决方案1】:

快速初查:所有队伍得分之和必须满足:

  • 20*19*2 ≤ sum(s) ≤ 20*19*3

每队打38场比赛,每场比赛可以得0分、1分或3分。 每个团队的总分 s 必须满足:

  • d + 3*w = s,其中 d 和 w 是非负整数(d - 平局次数,w - 获胜次数)
  • d + w ≤ 38

很容易找到每个团队的所有有效 (d, w)。

如果每个团队都有一个有效的 (d, w),则该表是可接受的,例如:

  • 对于任意 2 支球队,sum(w) ≤ 38+36
    对于任意 3 支球队,sum(w) ≤ 38+36+34
    对于任意 n 队,sum(w) ≤ 38+36+...+(40-2n)

    (按分数递减对团队进行排序;对每个 n 执行一次检查就足够了)

  • sum(d) = 4560 - 2*sum(s)
  • sum(w) = sum(s) - 1520

上述两个等式来自以下事实:

  • sum(s) = sum(d) + 3*sum(w)(平局 = 1 分,获胜 = 3 分)
  • sum(d)/2 + sum(w) = 20*19*2(每场比赛以一场胜利或两场平局结束)

所有这些条件都是必要的。我相信(但尚未证明)它们就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2017-12-19
    • 2012-12-18
    相关资源
    最近更新 更多