Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. from collections import Counter
  2.  
  3. def pairs(d):
  4. def pairname(a,b):
  5. a,b = sorted([a,b])
  6. return f"{a}/{b}"
  7. assert len(d) >= 2
  8.  
  9. result = Counter()
  10.  
  11. #reduce N>3 cases to an N==3 or N==2 case
  12. while len(d) > 3:
  13. #convert to sortable mutable collection
  14. seq = [[v,k] for k,v in d.items()]
  15.  
  16. #eliminate smallest department by pairing it with largest department
  17. while seq[0][0] > 0:
  18. seq = sorted(seq)
  19. seq[0][0] -= 1
  20. seq[-1][0] -= 1
  21. result[pairname(seq[0][1], seq[-1][1])] +=1
  22.  
  23. #convert back to dict, omitting any departments with no unpaired people
  24. d = {k:v for v,k in seq if v>0}
  25. if len(d) == 3:
  26. a,b,c = d.values()
  27. x,y,z = d.keys()
  28. if a+b < c or a+c < b or b+c < a:
  29. raise Exception("No solution")
  30. result[pairname(x,y)] += (+a+b-c)//2
  31. result[pairname(x,z)] += (+a-b+c)//2
  32. result[pairname(y,z)] += (-a+b+c)//2
  33. elif len(d) == 2:
  34. a,b = d.values()
  35. x,y = d.keys()
  36. if x != y:
  37. raise Exception("No solution")
  38. result[pairname(x,y)] += a
  39. elif len(d) == 1:
  40. raise Exception("No solution")
  41.  
  42. return dict(result)
  43.  
  44.  
  45. data = {"HR":10, "R&D":95, "Admin":99, "Mgmt": 50, "Sales": 77}
  46. print("input: ", data)
  47. print("output:", pairs(data))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement