形成具有特殊约束的数组的子集

时间:2017-11-04 05:31:14

标签: arrays algorithm greedy

我最近在编码竞赛中遇到了这个问题: 我们必须与成员组成一个技能小组,这样任何成员都不会比小组中任何另外两名成员的技能总和更多。 鉴于n个成员的一系列技能,找到可能具有上述约束的小队技能的最大总和。 我用了一个贪婪的算法: - 排序数组; - 使用三个指针并选择索引,使得前两个元素(最小)的总和小于所考虑的子阵列的最后一个(最大元素)。 - 还要继续移动索引以检查所有这些子数组并返回它们之间的最大总和。 但是这个案件通过了一半而其他案件都失败了有人可以帮助我解决我在这里失踪的问题吗?以下是我的计划:

In [709]: (a+b).sum(axis=1)
Out[709]: 
array([[1020,    0, 1020],
       [1530,  255, 1530]])

1 个答案:

答案 0 :(得分:0)

一些看起来有点不对劲的事情:

  1. 如果n等于2,则返回INT_MIN,因为for循环永远不会执行

  2. 更一般地说,您似乎认为大小为2的团队无效

  3. 当i等于0时,你想要计算从i到j加起来所有数字的分数,这等于sum [j]但是你计算res = sum [j] -sum [0 ]

  4. 由于您已对数组进行了排序,因此实际上您不需要在每次迭代中重置j(这仅在您因超时而失败时才重要)