向已经拥有烟斗的人均匀分发烟斗

时间:2019-07-12 14:50:37

标签: algorithm

有S根棍子需要分发给n位已经拥有一些棍子的人。 S棍在n个人中的分布应使每个人最终拥有的棍的数量方差最小。

考虑S = 50和n = 3的情况,每个人最初拥有以下数量的木棍:

  1. 第1个人已经有5条棍棒
  2. 第2个人已经有6根棍子
  3. 第3个人已经有8根棍子

该算法应按以下方式将50条烟斗分配给1号人,2号人和3号人:

    第一个人得到18根棍棒,总共23根棍棒;
  1. 第2个人获得17条棍棒,总共23条棍棒;
  2. 第3个人获得15条棍棒,总共23条棍棒。

在这种情况下,向这三个可用人员分配了50个额外的棍棒,以使每个人最终拥有相同数量的棍棒。由于方差不能小于零,因此该解决方案是最佳的。

1 个答案:

答案 0 :(得分:1)

让S为分发的棍棒数量,而s [1],s [2],…,s [n]为最初持有的人数1、2,...,n的棍棒数量。

  1. 计算S_total = S + s [1] + s [2] +…+ s [n]
  2. 计算S_indiv =下限(S_total / n)
  3. 计算S_resid = S_total%n
  4. 给人i等于(S_indiv-s [i])的木棍
  5. 选择S_resid个人每人再获得一根棍子

S_total是分配了S支额外的棍子后所有人持有的棍子总数。 S_indiv是任何人在公平分配后持有的最少摇杆数。 S_resid是要以任意方式分发(或如果所有个人应具有相同数量的棍子,则将其丢弃)的剩余棍子的数量