Advertisement
Guest User

Untitled

a guest
Apr 29th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. # python3
  2.  
  3. class JobQueue:
  4. def read_data(self):
  5. self.num_workers, m = map(int, input().split())
  6. self.jobs = list(map(int, input().split()))
  7. assert m == len(self.jobs)
  8.  
  9. def write_response(self):
  10. for i in range(len(self.jobs)):
  11. print(self.assigned_workers[i], self.start_times[i])
  12.  
  13. def assign_jobs(self):
  14. self.assigned_workers = [None] * len(self.jobs)
  15. self.start_times = [None] * len(self.jobs)
  16. min_heap = MinHeap(self.num_workers)
  17. for i in range(len(self.jobs)):
  18. self.assigned_workers[i] = min_heap._data[0][0]
  19. self.start_times[i] = min_heap._data[0][1]
  20. min_heap.ChangePriority(0, min_heap._data[0][1] + self.jobs[i])
  21.  
  22.  
  23. def solve(self):
  24. self.read_data()
  25. self.assign_jobs()
  26. self.write_response()
  27.  
  28. class MinHeap:
  29. def __init__(self, num_workers):
  30. # each worker contains (rank(index), next_free_time)
  31. self._data = []
  32. self.n = num_workers
  33. for i in range(num_workers):
  34. self._data.append((i, 0))
  35.  
  36. def ChangePriority(self, index, priority):
  37. old_p = self._data[index][1]
  38. self._data[index] = (self._data[index][0], priority)
  39. if priority < old_p:
  40. self.SiftUp(index)
  41. else:
  42. self.SiftDown(index)
  43.  
  44. self.SiftDown(index)
  45.  
  46. def RepairHeap(self):
  47. for i in range(int(self.n / 2), -1, -1):
  48. self.SiftDown(i)
  49.  
  50. def Parent(self, i):
  51. return self._data[int((i-1)/2)]
  52.  
  53. def LeftChild(self, i):
  54. return 2 * i + 1
  55.  
  56. def RightChild(self, i):
  57. return 2 * i + 2
  58.  
  59. def CompareWorker(self, worker1, worker2):
  60. if worker1[1] != worker2[1]:
  61. return worker1[1] < worker2[1]
  62. else:
  63. return worker1[0] < worker2[0]
  64.  
  65. def SiftUp(self, i):
  66. while i > 0 and self.CompareWorker(self._data[i], self._data[self.Parent(i)]):
  67. self._data[i], self._data[self.Parent(i)] = self._data[self.Parent(i)], self._data[i]
  68. i = self.Parent(i)
  69.  
  70.  
  71. def SiftDown(self, i):
  72. minIndex = i
  73. left = self.LeftChild(i)
  74. if left < self.n and self.CompareWorker(self._data[left], self._data[minIndex]):
  75. minIndex = left
  76.  
  77. right = self.RightChild(i)
  78. if right < self.n and self.CompareWorker(self._data[right], self._data[minIndex]):
  79. minIndex = right
  80. if i != minIndex:
  81. self._data[i], self._data[minIndex] = self._data[minIndex], self._data[i]
  82. self.SiftDown(minIndex)
  83.  
  84. if __name__ == '__main__':
  85. job_queue = JobQueue()
  86. job_queue.solve()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement