我有一个整数''somethings',我想把它们分成几组,每组都是一个整数。不仅如此,它们必须尽可能均匀地分布。
所以,我们假设我有9个苹果(apples = 9
),我需要将它们分成6组(groups = 6
)。而且,让我们说我不能削减一个苹果,所以apples/groups = 1.5
因此一组[1.5, 1.5, 1.5, 1.5, 1.5, 1.5]
将不起作用。一种解决方案是[2, 2, 2, 1, 1, 1]
或类似的。但我需要尽可能均匀地分发它们,因此解决方案必须是[2, 1, 2, 1, 2, 1]
。或者,如果将7个苹果分成5组,则解决方案为[2, 1, 2, 1, 1]
。
我知道你可以找到不同的'偶数'分布,比如说[1, 2, 1, 2, 1, 2]
,将9个苹果分成6组。但由于 more 均未均匀分布,否则两者都可以。为了争论起见,我只是选择以更高的数字开始,并尽可能长的替换。
考虑到我想要的团体的起始数量和数量,我如何找到解决方案? [我更喜欢python,但我理解Java / C / C ++,所以任何人都会这样做。]
背景:由于我似乎对此提出了很多不满,这就是原因:我正在编写一个自定义文本渲染器,我需要布置合理的文本。这意味着尽可能均匀地向单词之间的间距添加和整数像素。并尽可能快......
答案 0 :(得分:14)
如果您逐个浏览这些位置,在每个位置分配剩余对象的最公平分割时,您将获得所需的分布。对于9个对象分为6个位置的例子,这就是:
9÷6 = 1.5,所以分配2个苹果到第一个位置(向上舍入)。
7÷5 = 1.4,因此将1个苹果分配到第二个位置(向下舍入)。
6÷4 = 1.5,因此将2个苹果分配到第三个位置(向上舍入)。
4÷3 = 1.33 ..,所以分配1个苹果到第四个位置(向下舍入)。
3÷2 = 1.5,因此将2个苹果分配到第五个位置(向上舍入)。
1÷1 = 1,因此将1个苹果分配到第六个位置。
要从C的截断整数除法中得到a
÷b
的舍入除法,只要求和不会溢出,就可以使用(a + b/2) / b
。
答案 1 :(得分:2)
将它们分成相等的组,并将每个剩余元素添加到不同的组,直到元素用完为止。排除那些均匀分布的排列。如果顺序很重要,则具有n个元素和k个组将每个元素从n%k个剩余元素添加到每个n /(n%k)个组。就像它得到的一样。
你真的不需要任何特殊工具来做到这一点。
编辑: 这可以在处理原始列表时完成,以便维护订单。基本上每个n /(n%k)子列表必须具有n / k + 1个元素。 caf的解决方案虽然更干净。