如何最大化给定数组中有效索引的数量?

时间:2019-12-07 06:38:20

标签: arrays algorithm

我得到了两个大小相同的数组“ a”和“ b”。

说,数组“ a”:{1,5,6,3,2}

说,数组“ b”:{2,4,3,2,0}

如果a [i]> = b [i],则索引“ i”称为“有效”。

我们的任务是最大化给定数组“ a”中有效索引的数量,并返回有效索引的最终数量。

只允许对数组“ a”(任意次数)执行以下操作:

1)对于任何2个索引“ i”和“ j”,将a [i]替换为a [j]。

2)不允许对数组“ b”进行任何更改。

解决上述问题的方法:将a [0]与a [4]交换,我们得到“ 5”个有效索引。

您可以交换任意多次,任务是最大化有效索引的数量。

3 个答案:

答案 0 :(得分:0)

这是我想出的算法

  • 标识.Range("O:O")For i = Range("o2").Value To Range("P1").Value中最大的元素
  • 如果ActiveSheet大于x中的所有元素, 然后将其与b的最小元素配对, 否则,将其与x中不小于a的最小元素配对。
  • 使用剩余的元素继续搜索,直到不再有要配对的元素
  • 返回满足a [i]> = b [i]的对的数量

答案 1 :(得分:0)

我的想法(未经测试)

  • 对数组a进行排序。
  • 对于b中的每个元素,进行二进制搜索以找到b[i]中当前a的最接近的较大元素。找到后,将其从列表中删除。您可以为此使用数据结构来改善删除效果,或者使用布尔数组避免使用带元素。

对于示例输入:

"a":{1,5,6,3,2}

"b":{2,4,3,2,0}

排序后的a为:

1 2 3 5 6

因此,通过采用最接近的最大元素策略,我们得到5作为安排的答案,

 "b":{2,4,3,2,0} 
 "a":{2,5,6,3,1}

答案 2 :(得分:0)

考虑贪婪算法。 在未标记的数字中,找到a的最大值和最小值,例如a [m]和a [n],然后找到b的最大值b [i]。如果a [m]> = b [i];有效++并交换a [m]和a [i],否则交换a [n]和a [i]。之后,标记a [i]和b [i]。 循环播放直到全部标记。