


Решите задачу на Python 3 (ChatGPT точно не сможет)
Ограничения:
Лимит времени на один тест: 1 секунда
Лимит памяти на один тест: 256 мегабайт
У вас есть n независимых персонажей, каждый из которых поднимается по «двоичной» магической башне. Персонаж i начинает на уровне L[i] и должен достичь уровня D[i]. Каждый персонаж может использовать два типа заклинаний (каждое заклинание считается за одну единицу усилия):
Шаг: увеличить текущий уровень на 1.
Прыжок: удвоить текущий уровень.
Заклинания можно применять в любом порядке и любое количество раз, но персонаж должен закончить точно на уровне D[i] (нельзя понижать уровень, поэтому необходимо заранее спланировать заклинания, чтобы не превысить цель).
Ваша задача — подобрать для каждого персонажа такую последовательность заклинаний, которая приведет его от L[i] к D[i] с минимальным количеством заклинаний, и затем вывести сумму этих минимальных количеств для всех n персонажей.
Входные данные:
Первая строка содержит одно целое число n (1 <= n <= 2^18) - количество персонажей.
Вторая строка содержит n целых чисел L1, L2, ..., Ln - начальные уровни.
Третья строка содержит n целых чисел D1, D2, ..., Dn (1 <= L[i] < D[i] <= 10^18) - целевые уровни, каждый строго больше соответствующего начального.
Выходные данные:
Одно целое число — минимальное общее количество заклинаний, необходимых для того, чтобы каждый персонаж достиг нужного уровня.
Пример входных данных:
3
2 3 5
5 11 9
Пример выходных данных:
10
Примечание:
Персонаж 1: 2 - > 4 (прыжок) -> 5 (шаг) => 2 заклинания
Персонаж 2: 3 - > 4 (шаг) -> 5 (шаг) -> 10 (прыжок) -> 11 (шаг) => 4 заклинания
Персонаж 3: 5 -> 6 -> 7 -> 8 -> 9 => 4 заклинания
Всего = 2 + 4 + 4 = 10 заклинаний.
from collections import deque
def min_operations(start, target):
"""Нахождение минимального количества заклинаний для перехода с уровня start на уровень target."""
if start >= target:
return start - target
queue = deque([(start, 0)]) # (текущий_уровень, количество_заклинаний)
visited = set([start])
while queue:
current, ops = queue.popleft()
# Шаг
step = current + 1
if step == target:
return ops + 1
if step not in visited and step <= target:
visited.add(step)
queue.append((step, ops + 1))
# Прыжок
jump = current * 2
if jump == target:
return ops + 1
if jump not in visited and jump <= target:
visited.add(jump)
queue.append((jump, ops + 1))
return -1 # Не должны дойти до этой точки
def solve():
n = int(input())
L = list(map(int, input().split()))
D = list(map(int, input().split()))
total_ops = 0
for i in range(n):
total_ops += min_operations(L[i], D[i])
return total_ops
print(solve())