在列表中均匀分布(Google Foobar:Maximum Equality)

时间:2015-10-14 19:57:27

标签: python list python-2.7

这个问题来自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)

它在我自己的测试目的下运行良好,在十秒左右的时间内处理一百万次尝试。但它在未知输入下失败。

我错过了一些明显的东西,还是我做了一个我不应该做的假设?

1 个答案:

答案 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)