我最近遇到过这个问题,但没有想到解决这个问题。你能帮助一些伪代码吗?
给定一个包含四个整数A,B,C,D的数组,按某种顺序对它们进行混洗。如果整数是唯一的,则有24次洗牌。我的任务是获得最好的洗牌,以便
F(S) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])
是最大值
例如,考虑这个例子
A=5, B= 3, C=-1, D =5
s[0]=5, s[1]=-1, s[2]= 5, s[3] =3
会给我最大金额
F[s] =14
时间和空间复杂度为O(1)。
答案 0 :(得分:4)
由于您的数组具有有界大小,因此您使用的终止任何算法将具有时间和空间复杂度O(1)。因此,简单的算法"尝试所有的排列,找到最好的一个"将在适当的时间范围内解决问题。我并不是说这是理想算法的任何想象力,但如果您需要的是在时间/空间O(1)中工作的东西,那么你&# 39;得到了答案。
希望这有帮助!
答案 1 :(得分:4)
考虑按排序顺序列出您的积分:
A B C D
设x为距离AB
设y是距离BC
设z为距离CD
总是得分最高的订单是BDAC,得分为2x + 3y + 2z。
在您的示例中,排序的点是:
A=-1 B= 3 C=5 D=5
x=4, y=2, z=0
因此,最佳订单将是BDAC = 3-> 5-> -1-> 5,得分为14。
你可以证明这个结果只是考虑4点之间路径的所有排列,并用x,y,z计算得分。
e.g。
ABCD -> x+y+z
ACBD -> x+3y+z
ADBC -> x+3y+2z
等。
在任何排列中,分数最多使用x两次(因为A在末尾,所以路线只能到达或来自A两次)。类似地,z最多使用两次,因为D在最后。 y最多可以使用三次,因为添加了三件事。
排列BDAC使用x两次,z两次,y三次,因此永远不会被打败。
答案 2 :(得分:2)
如果数组已排序,此解决方案也可以运行:
F(S)= 2*abs(s[0]-s[3]) + abs(s[1]-s[2])
其中 s [0] = A , s [1] = B , s [2] = C 和 s [3] = d 强>