fork download
  1. S=sorted
  2. E=enumerate
  3. def f(d,p):
  4. q,M,U,D=[([],p,0)],-1,[],{}
  5. while q:
  6. (a,p,c),*q=S(q,key=lambda x:(len(x[1]),x[2]))
  7. if[]==p:M=[c,min(M,c)][M>-1];continue
  8. for j,k in E(p):
  9. for A in[a+[[k]]]+[a[:J]+[K+[k]]+a[J+1:]for J,K in E(a)]:
  10. if(P:=S(map(S,A)))not in U:
  11. U+=P,;C=sum(d+sum(j/2for j in i[:len(i)//2])+sum(i[len(i)//2:])for i in P)
  12. if not(V:=D.get(str(T:=p[:j]+p[j+1:])))or C<=V:q+=(P,p[:j]+p[j+1:],C),;D[str(T)]=C
  13. return M
  14.  
  15. import re
  16. for i in filter(None, """
  17. 6, [20] -> 26
  18. 6, [20, 30] -> 46
  19. 6, [20, 20] -> 36
  20. 12, [20, 2200] -> 2222
  21. 6, [20, 30, 40] -> 86
  22. 6, [20, 30, 60] -> 106
  23. 6, [20, 40, 60] -> 112
  24. 6, [20, 30, 40, 50] -> 121
  25. 6, [20, 30, 60, 70] -> 152
  26. 4, [20, 30, 20, 20, 30] -> 103
  27. 4, [30, 30, 20, 20, 30] -> 113
  28. 5, [88, 88, 88, 88, 8, 8] -> 286
  29. 5, [20, 20, 20, 20, 20, 20, 20] -> 115
  30. 100, [10, 20, 10, 20, 10, 20, 10, 20] -> 200
  31. 2, [10, 20, 30, 40, 50, 60, 70, 80] -> 288
  32. 5, [16, 30, 18, 10, 14, 12, 20, 28] -> 126""".split('\n')):
  33. *a, b = map(eval, re.split('\s\-\>\s|,\s(?=\[)', i))
  34. assert f(*a) == b
  35. print('tests passed')
Success #stdin #stdout 0.19s 15448KB
stdin
Standard input is empty
stdout
tests passed