Поле в игре «Речной бой» представляет собой полоску длины n клеток и шириной в одну клетку. Где‑то на поле расположен корабль из k клеток (k≤n). Какое наименьшее число выстрелов необходимо, чтобы гарантированно потопить корабль? После каждого выстрела сообщается его результат: «мимо», «ранен» или «убит».
python
def number_of_shots(n, k):
low = 0
high = n
while low <= high:
mid = (low + high) // 2
if can_sink_ship(n, k, mid):
high = mid - 1
else:
low = mid + 1
return high + 1
def can_sink_ship(n, k, shots):
if k * shots <= n:
return True
else:
return False
n = int(input("Введите длину поля: "))
k = int(input("Введите количество клеток корабля: "))
shots = number_of_shots(n, k)
print("Наименьшее число выстрелов для гарантированного потопления корабля:", shots)
В данном коде функция `number_of_shots` принимает два аргумента: `n` - длина поля и `k` - количество клеток корабля. Она реализует описанный выше алгоритм двоичного поиска и возвращает наименьшее число выстрелов для гарантированного потопления корабля.
Функция `can_sink_ship` принимает три аргумента: `n` - длина поля, `k` - количество клеток корабля и `shots` - количество выстрелов. Она проверяет, возможно ли гарантированно потопить корабль из `k` клеток с помощью `shots` выстрелов. Если количество выстрелов меньше или равно количеству клеток корабля умноженному на `k`, то функция возвращает `True`. В противном случае возвращает `False`.
После ввода длины поля `n` и количества клеток корабля `k`, вызывается функция `number_of_shots` и возвращаемое значение выводится на экран.
Это решение работает за время O(log n), так как мы используем двоичный поиск, который делит пространство поиска пополам на каждой итерации. Таким образом, мы уменьшаем пространство поиска в два раза на каждой итерации, пока не найдем искомое значение.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет