【问题标题】:How to divide N participants among M teams so that minimum pairs are formed?如何在 M 个团队中划分 N 个参与者以形成最小对?
【发布时间】:2015-05-05 21:26:00
【问题描述】:

如果我有两个数字,即NM,我必须找出如何在M 团队中划分N 人,以便每个团队中形成最少数量的配对,那么如何我应该去做吗? (另外,每个团队至少要有一个成员)

例如,如果我有N = 6M = 3, 然后,每个团队应该有 2 个人。因此,总共 3 支球队,意味着形成 3 对。

我知道我必须分发,以便分发应该尽可能均匀。但是我无法为此提出适当的算法。谢谢!

【问题讨论】:

  • n = 7m = 3 的情况会怎样?一个团队会有额外的成员,还是会排除那个孤独的参与者?
  • 一个团队会有一个额外的成员,是的。

标签: algorithm


【解决方案1】:

这很简单。首先,在每个团队中放置n/m 人。
您还有n%m (n modolus m) 名球员,将他们随机分配到球队,但每支球队最多可以得到一名这些“额外”球员。


在 m=2 的情况下,为什么这是正确的直觉很简单:

您需要将 n 个玩家分成xn-x,并且您希望尽量减少对数:

x(x-1)/2 + (n-x)(n-x-1)/2 = 
= (x^2-x + n^2 -2nx + x^2 -n +x)/2

使用导数找到最小值:

d(x^2-x + n^2 -2nx + x^2 -n -x)/2/dx = 2x -1 -2n +2x +1 = 4x-2n

看上面等于0的时候:

4x-2n = 0 -> x=n/2

任何m>0 的结果都将相似(尽可能接近n/m),只是更难证明。

【讨论】:

    【解决方案2】:

    与另一个答案类似,但有一个更直接证明的大纲。假设您有两支球队的球员人数相差超过 1,即一支球队有 k 名球员,一支球队有 k+j 名球员,其中 k >=1 且 j >=2。证明如果你将一名球员从拥有 k+j 名球员的球队转移到拥有 k 名球员的球队,那么使用二项式系数,你将得到更小的对数。

    【讨论】:

      【解决方案3】:
      1. 已完成团队数 = n / m
      2. 没有任何团队的玩家数量:n % m

      现在你有两个选择:

      1. 创建一个由剩余玩家组成的新团队。
      2. 为每支球队多派一名球员,直到没有单独的球员为止。

      我了解您选择了选项 2。

      我将向您展示一段可能对您有所帮助的 Java 代码。

      (我知道你的问题没有java标签,但是是一门很容易理解的高级编程语言)

      int people = n;
      int numberOfTeams = m;
      int peopleAlone = n;
      
      int initialPeopleForTeam = n/m;
      
       //This is an array of teams where each element of array is a team,
      // and his value the number of people that have the team.
              int teams[] = new int [numberOfTeams];
      
      
      //each team starts with n/m players. 
           for (int i = 0; i < m; i++){
              teams[i] = initialPeopleForTeam;
              peopleAlone = peopleAlone - initialPeopleForTeam;
          }
      
       //While the number of people alone is not 0, I'll give one more  person  to each team.
            int index = 0;
            while (peopleAlone > 0){
            teams[index] = teams[index] + 1;
            index++;
            peopleAlone--;
           }
      

      【讨论】:

        猜你喜欢
        • 2013-07-10
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        相关资源
        最近更新 更多