我正在尝试编写一个Double Elimination锦标赛,其中括号基于mod 4.第一轮应该处理所有的byes,以便在第2轮之后将不再有byes。我很难弄清楚确定我需要的再见数量背后的实际数学。如果有人能帮我解决这个问题,那将非常感激。
对于任何mod 4(0,1,2,3),有4个可能的答案我需要处理1,2,3的字节。
我的意思是一个例子 13名球员(13%4 = 1) 所以圆形1支架看起来应该是这样的 1vs2 2vs3 3vs4 4vs5 5vs6
和第2轮是 7vs冠军 8vs冠军 9vs冠军 赢家与胜利者然后你有输家支架
基本上如果你熟悉网站挑战,我想生成类似于他们的括号,但我无法弄清楚他们确定旁观的数学背后。
如果有人做过与此类似的事情,我将非常感谢他的帮助。
答案 0 :(得分:3)
N
是竞争对手的数量,轮数将为:
nRounds = Math.Ceiling( Math.Log( N, 2 ) );
第一轮中的位数将为:
firstRoundSlots = Math.Pow( 2, nRounds );
最重要的竞争对手也是如此,所以在你的例子中,在16轮中有13个竞争对手,所以前3名竞争对手都会再见。换句话说,旁边的数量是firstRoundSlots - N
。
比赛的顺序有点复杂。基本上这个想法是决赛回合是最好的竞争对手而不是第二好的竞争对手。在半决赛中,最好的竞争对手与第三好的竞争对手对决,第二好的竞争对手与第四好的竞争对手对决。等等等等。因此,从决赛中向后工作以生成订单是最容易的。
但是,如果你想知道一个反向生成回合订单的算法(即从第1轮开始并朝着决赛方向前进),我在这里写了一篇博文:
http://blogs.popart.com/2012/02/things-only-mathematicians-can-get-excited-about/
答案 1 :(得分:0)
我会告诉你我是如何解决这个问题的 你想要第2轮中的一些球员是2的力量。
第2轮的玩家数量是:(matches in round 1)/2 + byes)
设P是玩家的数量。
2^n = (P-byes)/2 + byes
2^(n+1) = P-byes + 2*byes
2^(u) = P + byes
所以找到最小的u
s.t. 2^u >= P
,然后有2^u-P
个byes。
示例案例:
7 - > 2 ^ u = 8 - > (8-7) - > 1再见
1再见,3场比赛 - >第2轮的4名球员
这不是mod 4,将9名玩家比作13: 9 - > 2 ^ u = 16 - > (16-9) - > 7个再见 13 - > 2 ^ u = 16 - > (16-13) - > 3个byes
一个更有趣的问题是如何安排最少数量的旁路,允许其他轮次比第一轮更多。
答案 2 :(得分:0)
我能想到的最简单的算法: