问题陈述:一排植物需要喷洒化学剂量。在这20种植物中,每种植物都含有20剂化学物质。化学物质B、C和D的剂量各不足20次。它们需要均匀地喷洒在20种植物中,因此,尽我们所能,它们在植物之间的间隔是相等的。
例如输入剂量:
chemical_a = [a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a]
chemical_b = [b, b, b]
chemical_c = [c, c]
chemical_d = [d]预期结果:
[a, a, a, ab, a, ac, a, a, a, abd, a, a, a, a, ac, a, ab, a, a, a]正如你所看到的,chemical_b的两边都有3个未填充的b斑点--除了中间剂量,其中一边有2个,另一边有3个。这种情况是不可避免的。如果引进了19剂量的chemical_d,其中一种植物就会错过--那就是什么植物并不重要。
如何使用Python 3解决这个问题?
发布于 2022-10-16 03:24:17
递归!
import math
def spread(long, short):
if long == 1 and short == 1:
return [True]
if long % 2 == 0:
left = right = int(long / 2)
if short == 1:
return [False] * (left - 1) + [True] + [False] * right # default to fewer lefts if even
elif short % 2 == 0:
short = int(short / 2)
return spread(left, short) + spread(right, short)
else:
short = math.floor(short / 2)
return spread(left - 1, short) + [True] + spread(right, short) # default to fewer lefts if even
else:
left = right = math.floor(long / 2)
if short == 1:
return [False] * left + [True] + [False] * right
elif short % 2 == 0:
short = int(short / 2)
return spread(left, short) + [False] + spread(right, short)
else:
short = math.floor(short / 2)
return spread(left, short) + [True] + spread(right, short)
chemical_a = 20
chemical_b = 3
chemical_c = 2
chemical_d = 1
def transform(x, type):
if x:
return type
else:
return ''
result_a = map(transform, spread(chemical_a, chemical_a), chemical_a * 'a')
result_b = map(transform, spread(chemical_a, chemical_b), chemical_a * 'b')
result_c = map(transform, spread(chemical_a, chemical_c), chemical_a * 'c')
result_d = map(transform, spread(chemical_a, chemical_d), chemical_a * 'd')
def convertTuple(tup):
st = ''.join(map(str, tup))
return st
print(list(map(convertTuple, zip(result_a, result_b, result_c, result_d))))结果:
['a', 'a', 'a', 'a', 'abc', 'a', 'a', 'a', 'a', 'abd', 'a', 'a', 'a', 'a', 'abc', 'a', 'a', 'a', 'a', 'a']https://stackoverflow.com/questions/74078103
复制相似问题