Улитка ползет по вертикальному шесту высотой H метров, поднимаясь за день на A метров, а за ночь спускаясь...

Тематика Информатика
Уровень 5 - 9 классы
C++ задачи на логику математические задачи программирование задачи с улиткой алгоритмы условия циклы
0

Улитка ползет по вертикальному шесту высотой H метров, поднимаясь за день на A метров, а за ночь спускаясь на B метров. На какой день улитка доползет до вершины шеста? Формат входных данных Программа получает на вход целые неотрицательные числа H, A, B, причем H > B. Числа не превосходят 100. Формат выходных данных Программа должна вывести одно натуральное число. Гарантируется, что A > B.

Нужно сделать в С++

avatar
задан 28 дней назад

2 Ответа

0

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

Анализ задачи:

  1. Условия:

    • Улитка поднимается на A метров за день.
    • Улитка спускается на B метров за ночь.
    • Высота шеста составляет H метров.
    • Гарантируется, что A > B, что означает, что улитка в конечном итоге будет подниматься.
  2. Процесс:

    • Каждый день улитка поднимается на A метров.
    • Если после подъема улитка достигает или превышает высоту H, мы можем остановиться и сообщить, что улитка достигла вершины.
    • Если улитка не достигла вершины, то ночью она скользит вниз на B метров.
  3. Расчет:

    • Можно использовать цикл, который будет отслеживать каждый день, пока улитка не достигнет вершины.

Программа на C++

Вот реализация описанного алгоритма на языке C++:

#include 

int main() {
    int H, A, B;
    std::cin >> H >> A >> B;

    int currentHeight = 0; // Начальная высота улитки
    int days = 0; // Счетчик дней

    while (true) {
        days++; // Увеличиваем счетчик дней
        currentHeight += A; // Подъем за день

        // Проверяем, достигла ли улитка вершины
        if (currentHeight >= H) {
            break; // Если достигла, выходим из цикла
        }

        currentHeight -= B; // Спад за ночь
    }

    std::cout 

avatar
ответил 28 дней назад
0

Давайте разберемся с задачей. Улитка за день поднимается на A метров, а за ночь спускается на B метров. При этом высота шеста составляет H метров. Нам нужно определить, на какой день улитка достигнет вершины шеста.

Анализ задачи

  1. За один полный день (день + ночь) улитка поднимается на A - B метров.
  2. Однако в тот день, когда улитка достигает вершины шеста, ночью спускаться она уже не будет. Поэтому нам нужно учитывать отдельно этот последний день.

Решение

  1. Если улитка за день поднимается на A метров, то в последний день, когда она достигнет вершины, она не будет спускаться ночью. Это значит, что как только улитка достигает высоты H, мы завершаем решение.
  2. Для всех предыдущих дней учитываем, что улитка совершает полный цикл (подъем днем и спуск ночью).

Таким образом, можно решить задачу следующим способом:

  • Рассчитаем, сколько метров улитке нужно пройти, чтобы остаться ниже H на последний день. Это будет H - A метров.
  • Найдем, сколько дней потребуется улитке, чтобы пройти эту высоту с учетом ежедневного прироста A - B.
  • Добавим 1 день для последнего рывка, когда улитка достигает вершины.

Алгоритм

  1. Определим, сколько дней улитке потребуется для прохождения H - A метров с учетом прироста A - B: [ \text{days} = \lceil \frac{H - A}{A - B} \rceil ] Здесь берем округление вверх, так как улитка не может пройти часть дня.
  2. После этого добавим 1 день для последнего рывка.
  3. Выведем общее количество дней.

Программа на C++

#include 
#include  // Для функции ceil
using namespace std;

int main() {
    int H, A, B;
    cin >> H >> A >> B;

    // Рассчитываем дни подъема
    int effectiveHeight = H - A; // Высота, которую нужно преодолеть до последнего дня
    int dailyClimb = A - B;      // Эффективный подъем за день (с учетом спуска ночью)

    // Если высота меньше либо равна дневному подъему
    if (effectiveHeight 

avatar
ответил 28 дней назад

Ваш ответ

Вопросы по теме