你有一个包含n个元素的数组。在任何移动中,您选择两个索引i和j,i不等于j并且在一个索引处增加值并且在其他索引处减小值。您可以多次进行此移动。我们需要的是可以具有相同值的最大元素数量(在任意数量的移动之后)。 1,2,3,4答案的示例是3,因为在应用移动任意次之后我们最多可以有3个元素相等。但我正在寻找算法来做到这一点,所以需要帮助。
答案 0 :(得分:3)
如上所述,这并不需要太多的算法。如果您可以根据需要多次执行此操作,则始终能够获得N
或N-1
元素相等的结果(其中N
是输入数组的大小。)
获取输入的总和。例如,在您的情况下:sum(1,2,3,4) = 10
。
如果sum % N == 0
,答案为N
。在此之前的任何时候,您将至少有一个元素高于sum/N
并且至少有一个元素低于N-1
。增加低点,递减高点。
否则答案是N-1
。最后一组可以有(int)sum/N
个元素等于{{1}},最后一个元素将是原始总和的余数。您可以将最后一个元素用作“备用”来增加/减少您想要的任何其他元素。
由于您不必实际找到转换,因此最终结果为O(N)。你只需取总和并用N来修改它来检查给出的答案。除非你想找到导致答案的步骤序列,否则没有使用递归或搜索“平均对”的方法。
答案 1 :(得分:0)
这可能是一个非常无效的算法 - 但你可以尝试某种动态编程。
def elems(array, previous_attempts = []):
# Get a list of all the possible arrays (after transforming the current array)
# and remove all of the arrays we have seen so far.
possible_arrays = possibilities(array) - previous_attempts
# If there are no more possible, return the number of elements the array
# has in common.
if possible_arrays is empty:
return num_in_common(array)
# Otherwise, for all the possibilities find the one that creates the maximum
# amount of elements in common.
max = 0
for a in possible_arrays:
# This is a recursive call that calculates the score for the possibility.
# It also keeps track of the current state so we don't revisit it.
score = elems(a, previous_attempts.append(array))
if score > max:
max = score
return max
答案 2 :(得分:0)
您可以计算数组中每个值的出现次数(让我们调用大小为A
的数组N
)。假设A
中任何值的最大出现次数为max
(可能是多个值),您只对出现max
次的值感兴趣,因为其他值不能建议的方法超过max+1
次出现。
极端情况:
max=N
答案为N
max=N-1
答案为N-1
在所有其他情况下,对于出现V
次的每个值max
,您试图找到平均值为V
但不等于{{}的其他两个值{1}}。如果它们存在,那么答案是V
(你可以增加它们,使它们都等于max+2
)。如果不存在此类索引V
和i
,则答案为j
(您可以增加任何其他两个值,直到其中一个值等于max+1
)。
修改强>
这个答案假定您只选择V
和i
一次,然后根据需要增加/减少它们(我想我误解了)。