Advertisement
Guest User

Untitled

a guest
Dec 9th, 2024
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1.  
  2. def solve() -> None:
  3. disk_map: list[int] = list(map(int, get_string(as_list=True)))
  4. disk_map_with_dots: list[int] = []
  5. curr_id: int = 0
  6. heaps_free_space: list[list[int]] = [[] for _ in range(10)] # one heapq per size
  7. # in the heapq we store idx first free space
  8. for i in range(len(disk_map)):
  9. if i % 2 == 0:
  10. # it's a file
  11. disk_map_with_dots += [curr_id for _ in range(disk_map[i])]
  12. curr_id += 1
  13. else:
  14. # it's free space
  15. if disk_map[i] > 0:
  16. heapq.heappush(heaps_free_space[disk_map[i]], len(disk_map_with_dots))
  17. for _ in range(disk_map[i]):
  18. disk_map_with_dots.append(-1)
  19.  
  20. i: int = len(disk_map_with_dots) - 1
  21. while i >= 0:
  22. if disk_map_with_dots[i] != -1:
  23. file_id: int = disk_map_with_dots[i]
  24. file_width: int = 0
  25. while i >= 0 and disk_map_with_dots[i] == file_id:
  26. i -= 1
  27. file_width += 1
  28. # swap with left most
  29. smallest_idx: int = 10**18
  30. best_width: int = 0
  31. for width in range(file_width, 10):
  32. if heaps_free_space[width]:
  33. if smallest_idx > heaps_free_space[width][0]:
  34. smallest_idx = heaps_free_space[width][0]
  35. best_width = width
  36. if smallest_idx != 10**18 and smallest_idx <= i:
  37. for j in range(file_width):
  38. disk_map_with_dots[smallest_idx + j] = file_id
  39. disk_map_with_dots[i + j + 1] = -1
  40. heapq.heappop(heaps_free_space[best_width])
  41. if best_width - file_width > 0:
  42. heapq.heappush(heaps_free_space[best_width - file_width], smallest_idx + file_width)
  43. else:
  44. i -= 1
  45.  
  46. ans: int = 0
  47. for i in range(len(disk_map_with_dots)):
  48. if disk_map_with_dots[i] != -1:
  49. ans += disk_map_with_dots[i] * i
  50. print(ans)
  51.  
  52.  
  53. if __name__ == "__main__":
  54. import time
  55. start_time = time.time()
  56. solve()
  57. print("--- %s seconds ---" % (time.time() - start_time))
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement