合并清单最小

时间:2019-02-26 11:01:42

标签: c# algorithm sorting math

给定一个列表A(大小为N)的正整数(0到1000之间),您必须通过一次累加2个元素并添加前一个结果来合并列表中的所有元素。

例如,O = {P,Q,R},可以通过3种不同的方式合并:

  1. 首先将P与Q合并,然后将结果与R合并
  2. 首先将P与R合并,然后将结果与Q合并
  3. 首先将R与Q合并,然后将结果与P合并

您必须找到合并列表并返回列表所需的最小总和。

例如,A = {100,250,1000},三种可能的合并策略是:

  1. 将P与Q合并:350; R的结果:1350;总计:1700
  2. 将P与R合并:1100; R的结果:1350;总计:2450
  3. 将P与Q合并:1250; R的结果:1350;总计:2600

最小的总和是1700。

要解决此问题,我的方法是,从逻辑上讲,如果对列表进行排序并仅简单地添加最小的元素,它将返回正确的结果:

    public static int Solution(int[] A)
    {
        if (A.Length < 2)
            return 0;

        var max = 0;
        Array.Sort(A);
        var current = A[0];
        for(var i = 1; i<A.Length; i++)
        {
            current += A[i];
            max += current;
        }

        return max;
    }

有什么想法吗?

编辑:这是一项在线评估,但没有任何答案就被拒绝了,我只是想提高自己并了解为什么这是错误的

1 个答案:

答案 0 :(得分:2)

之所以失败,是因为如果合并数量的排序顺序未保持不变,则合并2个元素的成本总会累计累计到总成本中。

例如-

[20,40,40,50]
  • 在这里,让我们按照您的排序顺序进行合并。
  • 合并 [20,40] 。当前费用= 60 。新数组= [60,40,50]
  • 合并 [60,40] 。当前费用= 160(60 + 100)。新数组= [100,50]
  • 合并 [100,50] 。当前费用= 310(160 + 150)。新数组= [150]

因此,总费用为 310

如您所见,60在合并时处于错误的阶段(在 [60,40,50] ),我们可以在其中合并 [ 40,50]

解决方案:

  • 使用Priority Queue
  • 通过使用优先级队列,我们​​可以动态地维护合并文件成本的排序顺序,因此可以降低累积成本。让我们再次浏览上一个示例。

[20,40,40,50]

  • 合并 [20,40] 。当前费用= 60 。新数组= [40,50,60] 。(60向后插入,将其插入优先级队列)。
  • 合并 [40,50] 。当前费用= 150(60 + 90)。新数组= [90,60]
  • 合并 [90,60] 。当前费用= 300(150 + 150)。新数组= [150]

因此,总费用为 300 ,比通过静态排序顺序获得的费用少10