我们在[1,..,4]
之间有一组整数值。我们希望将特定值分配到[1,...,10]
之间的不同长度的细分 1 。
我们在下表中显示了一个示例:
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
我的代码在C中,但我发现在python中表示它更容易 这里。
答案 0 :(得分:1)
可能在实施中有用的一些信息:
让V
为值的总数,S
为段的总数。
1)每个细分将获得的最小值数:V/S
。 (考虑整数除法)。
2)现在我们剩下V%S
个值,因为每个S
段都会获得V/S
个值。
对于V%S
值,您只需从1 to V%S
运行循环并将1
添加到每个细分中。
<强>代码:强>
#include<stdio.h>
int main()
{
int V=10; //no. of values
int S=4; //no. of segments
int arr[4]; //Considering 0-based indexing
int minimumValues = V/S;
int remaining = V%S;
for(int i=0;i<S;i++)
{
arr[i]=minimumValues;
if(i<remaining)
arr[i]++;
}
for(int i=0;i<S;i++)
printf("%d, ",arr[i]);
return 0;
}
答案 1 :(得分:1)
数学公式非常简单:
value / segments
为您提供至少必须放入每个细分的商品数量
value % segments
为您提供接收额外项目的细分数量
举例:
v/s v%s
a 4 4 1 0
b 3 4 0 3
c 3 2 1 1
有了这个,你会得到一个非常简单的算法:
unsigned int n = value/segments;
unsigned int c = value%segments;
for(unsigned int i = 0; i < segments; ++i)
theSegments[i] = n + (i < c);
或者,如果你想跳过数组:
unsigned int f(unsigned int values, unsigned int segments, theSegment)
{
// assuming theSegment being checked for < segments
return value/segments + (theSegment < value%segments)
}
如果你想使用一个基于1的数组(索引0为虚拟):
for(unsigned int i = 1; i <= segments; ++i)
theSegments[i] = n + (i <= c);