fork download
  1. from itertools import*
  2. D=lambda d,n,K,U:{**{a:b for a in d if(b:=[j for j in d[a]if~-(j in K)])},n:[*K,*U]}
  3. N=len
  4. def P(n,d,r,F):
  5. U=d.get(n,[]);d={i:d[i]for i in d if i-n};k=[[],[]]
  6. for i in d:
  7. if i<n or N(d[i])-i:k[i>F]+=d[i]
  8. if N(k[1])>=r:yield D(d,n,K:=k[1][:r],U),K;return
  9. for K in combinations(k[0]+k[1],r):
  10. if[]==k[1]or any(j in K for j in k[1]):yield D(d,n,K,U),K
  11. def f(a):
  12. d,I={},0
  13. for i in a:d[i]=d.get(i,[])+[I];I+=1
  14. q=[(N(a),)*2+(d,0)];M=-1
  15. while q:
  16. n,A,d,C=q.pop(0)
  17. if all(i==N(d[i])for i in d):M=[C,M][C>M>-1]
  18. elif n:
  19. if N(L:=d.get(n,[]))-n:
  20. for u,i in P(n,d,r:=n-N(L),F:=A-n):q+=[(F,A-n,u,C+N(i))]*(M>C+N(i)or M<0)
  21. q+=(n-1,A,d,C),
  22. return M
  23.  
  24. print(f([*map(int, '0'.split())]))
  25. print(f([*map(int, '1 2 3'.split())]))
  26. print(f([*map(int, '5 5 5 5 5'.split())]))
  27. print(f([*map(int, '23 7 4 8'.split())]))
  28. print(f([*map(int, '100 100 100 6'.split())]))
  29. print(f([*map(int, '5 5 5 5 5 5'.split())]))
  30. print(f([*map(int, '1 6 23 6 9 23 1 1 6'.split())]))
  31. print(f([*map(int, '5 5 8 8 4 4 1 3 3'.split())]))
Success #stdin #stdout 0.08s 14168KB
stdin
Standard input is empty
stdout
1
1
0
3
4
1
5
4