首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >每天将X个团队分成3个团队的数学解决方案

每天将X个团队分成3个团队的数学解决方案
EN

Stack Overflow用户
提问于 2019-03-19 16:53:08
回答 1查看 125关注 0票数 1

我试着把X个团队分成“游戏日”,每天由3个团队组成

对于15个团队来说,有不止一个解决方案可以解决这个问题。

找到9-21球队所有可能的赛程/比赛计划的最佳方法是什么?组数为11、14、17和20也会导致问题,因为total_matches/3=“必须是偶数/整数”

代码语言:javascript
复制
15 Teams // 105 Total Matches // 35 Total Days
D1 = 1:2  1:3  2:3
D2 = 2:4  2:5  4:5
D3 = 3:4  3:6  4:6
D4 = 4:1  4:7  1:7
D5 = 5:1  5:6  1:6
D6 = 6:2  6:7  2:7
7 = 7:3  7:5  3:5
8 = 8:1  8:9  1:9
9 = 9:2  9:10  2:10
10 = 10:1  10:11  1:11
11 = 11:2  11:8  2:8
12 = 12:1  12:13  1:13
13 = 13:2  13:14  2:14
14 = 14:1  14:15  1:15
15 = 2:12  2:15  12:15
16 = 3:8  3:10  8:10
17 = 3:9  3:11  9:11
18 = 3:12  3:14  12:14
19 = 4:8  4:12  8:12
20 = 5:8  5:13  8:13
21 = 6:8  6:14  8:14
22 = 7:8  7:15  8:15
23 = 9:4  9:13  4:13
24 = 9:5  9:12  5:12
25 = 10:4  10:14  4:14
26 = 11:4  11:15  4:15
27 = 12:6  12:10  6:10
28 = 13:3  13:15  3:15
29 = 14:5  14:11  5:11
30 = 5:10  5:15  10:15
D31 = 6:9  6:15  9:15
D32 = 6:11  6:13  11:13
D33 = 7:9  7:14  9:14
D34 = 7:10  7:13  10:13
D35 = 7:11  7:12  11:12
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 02:42:29

团队的可能组合/匹配的数量可以在数学上描述为Triangular Number

例如,当有9支球队时,比赛的数量是36场。

请注意,只有当k或k-1可被3整除时,这个数字才能被3整除。对于5个团队,您将最终得到10个可能的游戏。你的最后一周将只有一场比赛,或者你可以改变它的结构。

如果你想写出匹配的组合,你可以通过迭代两次团队的数量来列出它们。以下是一些示例Java代码。You may run it in an online Java compiler.

代码语言:javascript
复制
    public class MyClass {

        public static void main(String args[]) {
            int TEAMS = 10; //Number of teams
            int combos = 0;

            for(int i = 1; i <= TEAMS-1; i++){
                for(int j = i+1; j <= TEAMS; j++){
                    System.out.println("Team " + i + " plays Team " + j);
                    combos ++;
                }
            }

            System.out.println("There is " + combos + " possible matches");
        }
    }

我们不只是想要两支球队的每一个组合。我们想看看3个团队的组合。从数学上讲,我们需要一个Combination

我们可以将我们的三角数重写为n rewrite k。我们前面的例子变成了:

我们选择的每周有3支球队比赛。总的可能的日期组合是n选择3。在我们的例子中有9个团队。

我们有84种可能的日期组合。现在很多时候都有重叠的游戏。例如,如果我们让1,2和3队有一天比赛,那么我们不想再有1,2和4队的比赛,因为然后1和2互相比赛2场比赛。解决这个问题的办法可能是忽略重复的游戏。

我想指出,完美的解决方案是不存在的。对于大多数球队来说,没有一种解决方案可以让每天3支球队一起比赛,而这些球队还没有比赛过。例如,当我们有4支球队时,我们的游戏是: 1-2,1-3,1-4,2-3,2-4,3-4。如果我们在第一天拿到3支球队(1-2,1-3,2-3),那么第二天我们就得不到完美的组合(1-4,2-4,3-4)。

无论你如何打破它,你都可以排序出最好的组合,但最终你会得到许多随机的游戏。

我创建了下面的代码来查看每种可能的日期组合,并打印出不重复的日期。

代码语言:javascript
复制
    public class MyClass {

        public static void main(String args[]) {
            int TEAMS = 9; //Number of teams

            //Keep track of each game combination used
            boolean gamesPlayed[][] = new boolean[TEAMS+1][TEAMS+1];

            int day = 1;
            for(int i = 1; i <= TEAMS-2; i++){
                for(int j = i+1; j <= TEAMS-1; j++){
                    for(int k = TEAMS; k >= j+1; k--){

                        if(!gamesPlayed[i][j] && !gamesPlayed[i][k] && !gamesPlayed[j][k] )
                        {
                            System.out.println("Day "+ day++ + " Teams " + i + ", " + j + " & " + k + " Play");
                            gamesPlayed[i][j] = true;
                            gamesPlayed[i][k] = true;
                            gamesPlayed[j][k] = true;
                        }
                    }
                }
            }


            System.out.println("\nLeftover games");
            for(int i = 1; i <= TEAMS-1; i++){
                for(int j = i+1; j <= TEAMS; j++){
                    if(! gamesPlayed[i][j])
                        System.out.println(" Team " + i + " plays Team " + j);
                }
            }



        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55236865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档