Вопрос задан 24.01.2025 в 19:58. Предмет Информатика. Спрашивает Афанасьев Ваня.

Улитка ползёт по вертикальному шесту высотой h метров, поднимаясь за день на a метров, а за ночь спускаясь на b метров. На какой день улитка доползёт до вершины шеста?

Входные данные
Программа получает на вход натуральные числа h, a, b. Гарантируется, что a>b.

Выходные данные
Программа должна вывести одно натуральное число.

Примечание
При решении этой задачи нельзя пользоваться условной инструкцией if и циклами.

Примеры
входные данные
10
3
2
выходные данные
8
входные данные
20
7
3
выходные данные
5

Перейти к ответам

Ответы на вопрос

Отвечает Куртеева Анита.

Для решения задачи, где улитка ползёт по шесту, поднимаясь за день и спускаясь ночью, нужно понять, сколько дней потребуется, чтобы улитка достигла вершины.

Описание задачи:

  • Улитка ежедневно поднимается вверх на aa метров, но за ночь спускается на bb метров.
  • Высота шеста — hh метров.
  • Гарантируется, что a>ba > b, т.е. за день улитка поднимается больше, чем опускается за ночь.

Так как нельзя использовать условные инструкции и циклы, можно решить задачу, используя математические преобразования.

Анализ движения улитки

Пусть aa — это дневной подъём, а bb — ночной спуск. Тогда эффективное продвижение улитки за день с учётом ночного спуска составит aba - b метров.

Суть решения

Улитка движется по шесту с чистым подъёмом на aba - b метров каждый день. Однако в последний день она достигнет вершины шеста, не спускаясь ночью. Поэтому нужно определить количество дней до того момента, когда улитка поднимется на высоту hh или более метров без необходимости спуска.

Формула

  1. Если улитке нужно подняться на высоту hh, то за последние сутки она достигнет вершины, поднявшись на aa метров, без учёта ночного спуска.

  2. Это означает, что до последних суток ей нужно покрыть высоту hah - a метров (на которую она поднимется за предыдущие полные дни).

  3. За каждый день, кроме последнего, улитка проходит aba - b метров, поэтому количество полных дней, которые понадобятся для преодоления hah - a метров, равно ceil((ha)/(ab))\text{ceil}((h - a) / (a - b)), где ceil\text{ceil} — это округление вверх.

  4. Наконец, добавляем 1 день (последний день), когда улитка окончательно поднимется на вершину без спуска.

Итоговая формула:

days=haab+1\text{days} = \left\lceil \frac{h - a}{a - b} \right\rceil + 1

Где ceil(x)\text{ceil}(x) можно представить как целочисленное деление с округлением вверх: (x+y1)//y(x + y - 1) // y для x/yx / y.

Пример кода на Python

Этот код решает задачу, не используя условных операторов или циклов:

python
import math

def days_to_reach_top(h, a, b): return math.ceil((h - a) / (a - b)) + 1

Примеры

  1. Входные данные: h=10h = 10, a=3a = 3, b=2b = 2

    • Нужно преодолеть ha=103=7h - a = 10 - 3 = 7 метров за полные дни.
    • Каждый день улитка преодолевает ab=32=1a - b = 3 - 2 = 1 метр.
    • days=ceil(7/1)+1=7+1=8\text{days} = \text{ceil}(7 / 1) + 1 = 7 + 1 = 8.
    • Выход: 88.
  2. Входные данные: h=20h = 20, a=7a = 7, b=3b = 3

    • Нужно преодолеть ha=207=13h - a = 20 - 7 = 13 метров за полные дни.
    • Каждый день улитка преодолевает ab=73=4a - b = 7 - 3 = 4 метра.
    • days=ceil(13/4)+1=4+1=5\text{days} = \text{ceil}(13 / 4) + 1 = 4 + 1 = 5.
    • Выход: 55.

Таким образом, формула позволяет рассчитать количество дней для достижения вершины без использования условий и циклов.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос