
Сдать решение задачи 2-Ну все, я попрыгал! Полный балл: 100 Ограничение времени: 1 с Ограничение
памяти: 512M Ограничение размера стека: 64M Задача 2: Ну все, я попрыгал! Персонаж известной компьютерной игры Марио постарел и почти перестал прыгать. Но совсем недавно он увидел спуск из N ступенек, и его накрыло ностальгией. Марио встал на самую верхнюю ступеньку и решил преодолеть этот спуск при помощи прыжков. Когда-то Марио знал тысячи различных видов прыжков, но теперь он смог вспомнить только два: короткие и длинные. Короткий прыжок позволяет спуститься на произвольное число ступенек, не большее X, а длинный — на произвольное число, не большее Y (X < Y). Но в силу возраста Марио не может делать два длинных прыжка подряд и вынужден между ними совершать хотя бы один короткий. При этом Марио не хочет слишком уж сильно ухудшить свои прошлые результаты и поэтому постарается обойтись как можно меньшим числом прыжков. Помогите Марио посчитать минимальное количество прыжков, требующееся для преодоления всех N ступенек. Входные данные В первой строке входных данных записано целое число X — максимальная длина короткого прыжка. Во второй строке записано целое число Y (1 ≤ X < Y < 1018) — максимальная длина длинного прыжка. В третьей строке записано целое число N (1 < N < 1018) — количество ступенек в спуске. Выходные данные В единственной строке выведите целое число — минимальное число прыжков, необходимое Марио для спуска. Система оценки Решения, правильно работающие только для случаев, когда X, Y и N не превосходят 105, будут оцениваться в 35 баллов. Решения, правильно работающие только для случаев, когда X, Y и N не превосходят 109, будут оцениваться в 50 баллов. Примечание Обратите внимание, что входные данные, а также ответ могут быть достаточно большими, поэтому следует использовать 64-битный тип данных, например long long в C/C++, long в Java и C#, int64 в Pascal.

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

Ответ:
X = int(input())
Y = int(input())
N = int(input())
if (N % (X + Y)) == 0:
print(int((N / (X + Y)) * 2))
else:
if (N % (X + Y)) <= Y:
print(int(((N // (X + Y)) * 2) + 1))
else:
print(int(((N // (X + Y)) * 2) + 2))
=============================
На Python



Ответ:
#include <iostream>
using namespace std;
int main()
{
long long int x, y, n, ans;
cin >> x >> y >> n;
if(n%(x+y)==0)
{
ans = n/(x+y)*2;
}
else if(n%(x+y)>y)
{
ans = n/(x+y)*2+2;
}
else
{
ans = n/(x+y)*2+1;
}
cout << ans;
return 0;
}
Объяснение:
для g++(с++)



Для решения этой задачи можно использовать динамическое программирование.
Давайте обозначим dp[i]
как минимальное количество прыжков, необходимых для достижения ступеньки номер i
.
Изначально, dp[0] = 0
(так как Марио уже находится на верхней ступеньке), а все остальные элементы массива dp
инициализируются бесконечно большим значением (например, dp[i] = INF
).
Затем мы можем перебрать все ступеньки от 1 до N
и вычислить минимальное количество прыжков для каждой ступеньки, используя уже рассчитанные значения для предыдущих ступенек.
Для каждой ступеньки i
мы можем рассмотреть два случая:
- Мы можем сделать короткий прыжок с предыдущей ступеньки:
dp[i] = min(dp[i], dp[i - X] + 1)
. - Мы можем сделать длинный прыжок с предыдущей ступеньки (если предыдущий прыжок был коротким):
dp[i] = min(dp[i], dp[i - Y] + 1)
.
После перебора всех ступенек от 1 до N
, значение dp[N]
будет содержать минимальное количество прыжков, необходимых для преодоления всех ступенек.
Вот пример реализации данного подхода на языке Python:
pythondef min_jumps(X, Y, N):
dp = [float('inf')] * (N + 1)
dp[0] = 0
for i in range(1, N + 1):
if i - X >= 0:
dp[i] = min(dp[i], dp[i - X] + 1)
if i - Y >= 0 and dp[i - Y] != float('inf'):
dp[i] = min(dp[i], dp[i - Y] + 1)
return dp[N]
# Пример использования
X = 3
Y = 5
N = 10
result = min_jumps(X, Y, N)
print(result) # Вывод: 4
Это решение работает за линейное время от количества ступенек N
, что является эффективным для данной задачи.


Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili