Arrays 找到一种最小化最大差异的方法

Arrays 找到一种最小化最大差异的方法,arrays,sorting,greedy,Arrays,Sorting,Greedy,N人们需要不同数量的钱:X_i(1这可以通过贪婪的方法解决 首先,请注意,初始期望金额也是所需金额和给定金额之间的初始差异(因为您已向所有人提供了0)。因此,对于您的示例,差异从[5,4,2,2]开始 第二,请注意,在给定时间向差异最大的人以外的任何人捐款不会减少最大差异。例如,如果数组为5、4、2、2,则向第一人以外的任何人捐款不会减少最大差异:[5、3、2、2]、[5、4、1、2]、[5、4、2、1](最大差值保持在5) 因此,您应该始终将一枚硬币交给在给定点上具有最大差异的人(或其中任何一

N人们需要不同数量的钱:X_i(1这可以通过贪婪的方法解决

首先,请注意,初始期望金额也是所需金额和给定金额之间的初始差异(因为您已向所有人提供了0)。因此,对于您的示例,差异从[5,4,2,2]开始

第二,请注意,在给定时间向差异最大的人以外的任何人捐款不会减少最大差异。例如,如果数组为5、4、2、2,则向第一人以外的任何人捐款不会减少最大差异:[5、3、2、2]、[5、4、1、2]、[5、4、2、1](最大差值保持在5)

因此,您应该始终将一枚硬币交给在给定点上具有最大差异的人(或其中任何一枚,如果出现平局),直到您用完硬币:[5,4,2,2]->[4,4,2,2]->[3,4,2,2]->[3,3,2,2]->[2,3,2,2]->[2,2,2,2],等等


当然,在实现该算法时,您实际上不需要一个接一个地给硬币,但这是您应该做的一般想法。

这可以在对债务金额进行逐级排序后在一次传递中解决。债务是从上到下支付的。此python代码应该明确:

def分配后获得最大债务(债务、金钱):
如果不是债务:
提高价值错误('请指定债务')
debt.sort(reverse=True)
debt.append(0)#添加零债务以简化算法
对于范围(1,len(债务))中的i:
最后金额=债务[i-1]
新金额=债务[i]
#要将最大差异从“上次金额”降低到“新金额”,
#我们需要为每一笔债务支付差额
支付金额=(上次金额-新金额)*i
#检查我们是否有足够的钱支付全部金额
如果要付
  e.g : N = 4, M=3

  X1=5, X2=4, X3=2, X4=2

  In this case we should distribute like : 2 1 0 0 
  so difference array is : 3 3 2 2
  maximum difference is minimized (which is 3)