Задача №303. Коровы. По данному числу n закончите фразу "На лугу пасется..." одним из возможных продолжений: "n коров", "n корова", "n коровы", правильно склоняя слово "корова".
Входные данные: Дано число n (n<100).
Выходные данные: Программа должна вывести введенное число n и одно из слов (на латинице): korov, korova или korovy, например, 1 korova, 2 korovy, 5 korov. Между числом и словом должен стоять ровно один пробел.
Пример: входные данные — 1; выходные данные — 1 korova
Алгоритм.
- Прочитать n.
- Найти последнюю цифру
и число десятков-единиц . Так как n < , , но запись делает программу верной и для больших чисел. - Если
, слово — korov ( korov, korov, korov, korov). - Иначе, если
, слово — korova. - Иначе, если
равна , или , слово — korovy. - Иначе (
, , , , , ) слово — korov. - Вывести n и слово через один пробел.
Программа (Python):
n = int(input())
d = n %
t = n %
if <= t <= :
word = "korov"
elif d == :
word = "korova"
elif <= d <= :
word = "korovy"
else:
word = "korov"
print(n, word)
Проверка: при n =
Окончание слова зависит от последней цифры, но числа
n = int(input())
d = n %
t = n %
if <= t <= :
word = "korov"
elif d == :
word = "korova"
elif <= d <= :
word = "korovy"
else:
word = "korov"
print(n, word)
Задача №304. Билеты на метро. Билет на одну поездку в метро стоит 15 рублей, билет на 10 поездок стоит 125 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок.
Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна.
Входные данные: Дано одно число n – количество поездок.
Выходные данные: Выведите три целых числа, равные необходимому количеству билетов на 1, на 10, на 60 поездок.
Пример: входные данные — 129; выходные данные — 0 1 2
Идея. Цена одной поездки: по билету на
Алгоритм.
- Прочитать n.
- Количество билетов на
поездок равно либо (остаток добираем мелкими билетами), либо (покрываем остаток ещё одним большим билетом). Меньше брать невыгодно: замена поездок мелкими билетами стоит не меньше руб. - Для каждого такого количества c
найти остаток . - Для остатка r перебрать количество билетов на
поездок c от до ; оставшиеся поездки покрыть билетами на поездку: . - Посчитать стоимость
и запомнить вариант с минимальной стоимостью. - Вывести c
, c , c .
Программа (Python):
n = int(input())
best = None
best_cost = None
for c in (n // , n // + ):
r = max( , n - * c )
for c in range( , r // + ):
c = max( , r - * c )
cost = * c + * c + * c
if best_cost is None or cost < best_cost:
best_cost = cost
best = (c , c , c )
print(best[ ], best[ ], best[ ])
Проверка для n =
, остаток : девять билетов на поездку стоят , один билет на поездок стоит . Лучше взять один на : руб. : руб.
Минимум
Это задача на перебор с отсечением: достаточно проверить только выгодные количества билетов, потому что более «оптовые» билеты дешевле в расчёте на одну поездку.
n = int(input())
best = None
best_cost = None
for c in (n // , n // + ):
r = max( , n - * c )
for c in range( , r // + ):
c = max( , r - * c )
cost = * c + * c + * c
if best_cost is None or cost < best_cost:
best_cost = cost
best = (c , c , c )
print(best[ ], best[ ], best[ ])
