这个问题来自Google Foobar,我的代码通过了除最后一次测试之外的所有测试,输入/输出都隐藏了。
换句话说,选择数组的两个元素x [i]和x [j] (我与j不同)并同时将x [i]递增1并递减 x [j] by 1.你的目标是获得数组中的尽可能多的元素 你可以有同等的价值。
例如,如果数组为[1,4,1],则可以执行操作 如下:
从第1辆车发送一只兔子到第0辆:递增x [0],递减 x [1],导致[2,3,1]从第1辆车送到第2辆: 递增x [2],递减x [1],得到[2,2,2]。
现在阵列中的所有元素都是相同的,你有一个 向Beta兔报告的策略!
注意,如果数组是[1,2],则最大可能的数量相等 我们可以获得的元素是1,因为汽车永远不会有相同的 兔子的数量。
写一个函数answer(x),它取整数x和x的数组 返回我们可以得到的相等数组元素的最大数量 根据需要多次执行上述命令。
列车中的汽车数量(x中的元素)至少为2, 想要分享汽车的兔子数量不超过100只 (x的每个元素)将是[0,1000000]范围内的整数。
from collections import Counter
def most_common(lst):
data = Counter(lst)
return data.most_common(1)[0][1]
def answer(x):
"""The goal is to take all of the rabbits in list x and distribute
them equally across the original list elements."""
total = sum(x)
length = len(x)
# Find out how many are left over when distributing niavely.
div, mod = divmod(total, length)
# Because of the variable size of the list, the remainder
# might be greater than the length of the list.
# I just realized this is unnecessary.
while mod > length:
div += length
mod -= length
# Create a new list the size of x with the base number of rabbits.
result = [div] * length
# Distribute the leftovers from earlier across the list.
for i in xrange(mod):
result[i] += 1
# Return the most common element.
return most_common(result)
它在我自己的测试目的下运行良好,在十秒左右的时间内处理一百万次尝试。但它在未知输入下失败。
我错过了一些明显的东西,还是我做了一个我不应该做的假设?
答案 0 :(得分:9)
抱歉,您的代码在我的测试中无效。我喂它[0,0,0,0,22]然后回到[5,5,4,4,4]的列表,回答为3;最大值是4辆相同的汽车,原始输入就是一个这样的例子。 [4,4,4,4,6]将是另一个。我怀疑这是你的问题,而且数据库中还有其他一些这样的例子。
对于N辆车,最大值为N(如果兔子数量可被汽车数量整除)或N-1。这看起来很简单,我担心我错过了对问题的限制。它没有要求平衡的人口,就像尽可能多的汽车人口应该是平等的一样。简而言之:
def answer(census):
size = len(census)
return size if sum(census) % size == 0 else (size-1)