我们有一组介于[1,..,4]
之间的整数。我们希望在1的基础上将特定值分布到[1,...,10]
之间不同长度的段中。你知道吗
下表给出了一个示例:
Example Value segments distribution
a 4 4 1 on each segment
b 3 4 1 on the first 3 segments
c 3 2 2 on the first segment ( 1 + 1) and 1 on the second segment
我的解决方案如下:
所有示例(a、b、c)都在下面的代码中表示。具有以下输出:
#example a [1, 1, 1, 1]
#example b [1, 1, 1, 0]
#example c [2, 1]
#!/usr/bin/env python
import os
import re
import sys
import argparse
if __name__ == "__main__":
threshold = 4
#(a) value = 3 and segments = 4
dispatch = 1
value = 4 + 1
seg1 = [0,0,0,0]
for i in range(0, len(seg1)):
if dispatch == value:
break
seg1[i] += 1
dispatch += 1
print ("example a %s" %seg1)
# (b) value = 3 and segments = 4
dispatch = 1
value = 3 + 1
seg2 = [0,0,0,0]
for i in range(0, len(seg2)):
if dispatch == value:
break
seg2[i] += 1
dispatch += 1
print ("example b %s" %seg2)
# (c) value = 3 and segments = 2
value = 3 + 1
dispatch = 1
seg3 = [0,0]
for i in range(len(seg3) - 1, -1, -1):
if i == 0:
seg3[i] = value - dispatch
break
seg3[i] += 1
dispatch += 1
print ("example c %s" %seg3)
我发现我使用的解决方案非常难看。我不能从这些例子中推断出一个公式。有没有一个公式我们可以从这些例子中推断出来?这将使算法有一个类似公式背后的lol
My code is in C but i found it easier to represent it in python in here.
数学公式很简单:
提供至少要放入每个段的项目数
提供接收额外项目的段数
举你的例子:
这样,你就得到了一个非常简单的算法:
或者,如果要跳过数组:
如果要使用基于1的数组(将索引0作为伪索引):
一些可能对实施有用的信息:
设
V
为值的总数,S
为段的总数。你知道吗1)每个段将获得的最小值数:
V/S
。(考虑整数除法)。你知道吗2)现在我们只剩下
V%S
值,因为每个S
段将获得V/S
值。 对于V%S
值,您只需从1 to V%S
运行一个循环,并将1
添加到每个段。你知道吗代码:
相关问题 更多 >
编程相关推荐