我得到了两个大小相同的数组“ 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”个有效索引。
您可以交换任意多次,任务是最大化有效索引的数量。
答案 0 :(得分:0)
这是我想出的算法
.Range("O:O")
:For i = Range("o2").Value To Range("P1").Value
中最大的元素ActiveSheet
大于x
中的所有元素,
然后将其与b
的最小元素配对,
否则,将其与x
中不小于a
的最小元素配对。答案 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]。 循环播放直到全部标记。