Python(/ C / Java):如何将整数除以整数,并生成均匀分布的整数列表?

时间:2011-12-13 12:50:34

标签: algorithm

我有一个整数''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 ++,所以任何人都会这样做。]

背景:由于我似乎对此提出了很多不满,这就是原因:我正在编写一个自定义文本渲染器,我需要布置合理的文本。这意味着尽可能均匀地向单词之间的间距添加和整数像素。并尽可能快......

2 个答案:

答案 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的解决方案虽然更干净。