Привет! Давай разберёмся с этой задачей пошагово.
Понимание задачи:
У нас есть массив доминошек с координатами \(x_1, x_2, ..., x_N\) и каждой доминошке соответствует её магическая сила \(h_1, h_2, ..., h_N\). Когда толкается первая доминошка, она начинает цепную реакцию, толкая доминошки вперёд, до тех пор, пока \(x_i + h_i \geq x_j\). Толкнув последнюю доминошку, она начинает цепную реакцию назад, до тех пор, пока \(x_j - h_j \leq x_i\).
Цель: Узнать общее количество доминошек, которые упадут.
Решение:
Считывание данных:
- У нас есть число \(N\) и два массива координат и сил.
Имитация падения слева направо:
- Начнём с первой доминошки. Проверяем, насколько далеко распространяется её воздействие. Если следующее домино находится в зоне воздействия текущей, оно тоже падает и распространяет своё воздействие.
Имитация падения справа налево:
- Начнём с последней доминошки и аналогично проверяем её воздействие назад.
Подсчёт уникальных упавших доминошек:
- Объединяем результаты падения слева и справа, чтобы посчитать общее количество упавших доминошек.
def count_fallen_dominoes(n, x, h):
# Левое падение
fallen_from_left = [False] * n
max_reach_from_left = x[0] + h[0]
fallen_from_left[0] = True
for i in range(1, n):
if x[i] <= max_reach_from_left:
fallen_from_left[i] = True
max_reach_from_left = max(max_reach_from_left, x[i] + h[i])
# Правое падение
fallen_from_right = [False] * n
max_reach_from_right = x[n-1] - h[n-1]
fallen_from_right[n-1] = True
for i in range(n-2, -1, -1):
if x[i] >= max_reach_from_right:
fallen_from_right[i] = True
max_reach_from_right = min(max_reach_from_right, x[i] - h[i])
# Подсчёт упавших
total_fallen = 0
for i in range(n):
if fallen_from_left[i] or fallen_from_right[i]:
total_fallen += 1
return total_fallen
# Пример использования
n = 4
x = [1, 5, 7, 8]
h = [2, 3, 1, 1]
print(count_fallen_dominoes(n, x, h)) # вывод: 3
Теперь ты знаешь, как решать эту задачу! Если есть вопросы, не стесняйся спрашивать.