我的第一个难题是,很高兴收到改进建议!
场景是;您是一家激流漂流公司的经理。每天早晨,您都会收到一份预订清单,您必须将它们分类为木筏装载。用您选择的语言编写适合您的程序或函数。
每个木筏最多可容纳一个n
客户,并且每个预订的n
人数是1至2 (含)之间的一组。必须遵守以下规则;
不得拆分任何组。如果他们一起订票,他们必须都在同一排。
筏子的数量必须最小化。
在符合前两个规则的前提下,组必须在木筏之间尽可能平均地分布。
输入。
数字n
(您可能会认为这是一个正整数),以及所有预订的大小。如果您的语言支持,则可以是数组,列表或类似的数据结构。所有这些都是介于1和之间的正整数n
。预订的顺序没有定义,也不重要。
输出。 预订编号列表,分为筏负载。必须明确指出分组,例如;
- 列表或数组数组。
- 每个筏的逗号分隔列表。每个筏之间的换行符。
如何实施第三条规则由您决定,但这可能涉及找到平均木筏占用率,并尽可能减少其偏离。这是一些测试用例。
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
适用标准规则,以最短的代码为准。玩得开心!
编辑; 建议为第三条规则尽可能平等地定义的方法。
一旦r
确定了木筏的数量(服从第二条规则),则a
可以通过对预订进行求和并除以来计算平均占用率r
。对于每个筏,可以使用找出与平均占用率的偏差d(x) = abs(n(x)-a)
,其中n(x)
每个筏中的人数是和1 <= x <= r
。对于某些连续的单值函数f(y)
,该函数严格为正,并且对于所有正数具有严格为正的一阶和非负二阶导数y
,我们定义一个非负数F
作为所有之和f(d(x)), 1 <= x <= r
。满足前两个规则,且F
等于全局最小值的筏选择的任何选择也将满足第三个规则。
g(y) = y
(第二个导数为零)或g(y) = y²
(第一个导数为0时y = 0
)。