比赛日程安排算法,每个队员发挥特定的比赛数量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比赛日程安排算法,每个队员发挥特定的比赛数量相关的知识,希望对你有一定的参考价值。

我有一定数量的球队。我希望每支球队在4个特定时间与4个不同的对手进行4场比赛。

复杂的原因在于没有球队可以同时进行2场不同的比赛。例如,如果球队1正在这样打球 team1 vs team2,team1 vs team3,team1 vs team4,team1 vs team5 然后team2已经占据了第一个时间段,所以team2可以像这样玩 (team2 vs team1),team2 vs team3,team2 vs team4,team2 vs team5 但是问题出现了,team3将在team1和team2的第二个时间段中播放,但这是无法完成的。

我不知道这个算法可以调用什么,但我正在寻找算法来实现它。

我找了一个搜索循环和其他比赛,如匹配算法和婚姻问题,但我认为我的问题是不同的。如果我错了,请纠正我。

任何帮助是极大的赞赏。

答案

我已经得出结论,如果球队的数量是奇数,那就没有解决方案了。设N是团队的数量。我们需要总共N*4/2比赛,每队四场比赛,但每场比赛都计入两队。要在四个时段中进行N*2比赛,我们必须平均每个时段的N/2比赛。我们一次最多可以做floor(N/2)比赛。如果N是奇数,floor(N/2) < N/2

一个只适用于N的解决方案(如果存在的话)是否有用?

另一答案

该算法适用于任意数量的团队。 假设锦标赛中有6支队伍。 enter image description here

该解决方案基本上告诉您如何填充6x6矩阵,矩阵中的每个条目都是行与列之间的匹配。 考虑算法中的一些规则 1.矩阵从左到右,从上到下递增值。 mat[0][0] = 1 2.每当i == j,然后填充[n-1][j]矩阵而不是[i][j]。基本上,i==j没有参赛作品 3.当矩阵中的条目达到6时,将其设为1 我们将遵循此规则并开始从[0][0]列填充矩阵。意味着首先我们将填充第0列的每一行然后移动到第1列。 - 在[0][0],申请规则2.所以填写mat[n-1][0] = 0 - 在mat[1][0],填写下一个数字,即2,类似于[2][0], [3][0], [4][0] - 现在第1列,从值2开始 - mat[1][0] = 2; - 在mat[1][1]应用规则2,填写当前列的最后一行,即mat[n-1][1] = 3 如果你希望每支球队只与其他球队一起比赛,请使用较低的三角形。 如果你希望每支球队都能与其他球队一起打2场比赛,那么主场和客场都会使用低三角和高三角。 希望你们理解我的解决方案。 干杯

另一答案

一个简单的算法:

Round 1
1  2  3  4
8  7  6  5

然后旋转2-8位...

Round 2
1  8  2  3
7  6  5  4

Round 3
1  7  8  2
6  5  4  3

http://en.wikipedia.org/wiki/Round-robin_tournament#Scheduling_algorithm

(如果有一个奇数,可以通过添加一个虚拟配对来表示再见,但是随后Patricia Shanahan指出,并非每个球队都会进行每一轮比赛。因此,偶数球队和至少六支球队都是需要符合要求。)

以上是关于比赛日程安排算法,每个队员发挥特定的比赛数量的主要内容,如果未能解决你的问题,请参考以下文章

编程练习赛41:题目1 : 比赛日程安排

HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

十八周总结

用户故事排球教练助手

循环赛日程表

华为OD机试 - 比赛评分(Java) | 机试题+算法思路+考点+代码解析 2023