Решение задач на Python: автобусы и ручки
Полное решение задач на Python с математическими алгоритмами. Расчет автобусов для лагеря и ручек со скидкой с примерами кода.
Решение задач на Python
Задача №1: Расчет минимального количества автобусов для летнего лагеря
Условие: В летний лагерь нужно отвезти n детей и m вожатых с помощью автобусов (значения считываются из входного потока в программе ниже). Максимальная вместимость каждого автобуса 20 человек. Допишите программу для вычисления минимального числа автобусов, необходимых для перевозки детей вместе с вожатыми. Результат сохраните в виде целого числа в переменной total_bus. На экран ничего выводить не нужно.
Задача №2: Расчет максимального количества гелевых ручек со скидкой
Условие: Гелевая ручка стоит x рублей (значение вводится из входного потока в программе ниже). Сегодня магазин предоставляет скидку в 10 % на каждую купленную ручку. Какое наибольшее количество таких ручек можно будет купить на 500 рублей? Результат сохраните в переменной res в виде целого числа.
P.S. На экран ничего выводить не нужно.
Для решения этих задач на Python необходимо использовать математические алгоритмы округления и целочисленного деления. В первой задаче мы рассчитаем минимальное количество автобусов, разделив общее количество людей на вместимость автобуса и округлив вверх. Во второй задаче определим максимальное количество ручек, поделив бюджет на цену со скидкой и взяв целую часть результата.
Содержание
- Задача №1: Расчет минимального количества автобусов
- Задача №2: Расчет максимального количества гелевых ручек
- Детальное решение с примерами кода
- Объяснение алгоритмов
- Тестирование программ
Задача №1: Расчет минимального количества автобусов
Для решения этой задачи нам нужно определить минимальное количество автобусов вместимостью 20 человек, необходимых для перевозки n детей и m вожатых.
Алгоритм решения:
- Рассчитаем общее количество людей:
total_people = n + m - Разделим общее количество людей на вместимость одного автобуса
- Используем округление вверх, так как даже если остался 1 человек, нужен дополнительный автобус
# Код для решения задачи
n = int(input()) # количество детей
m = int(input()) # количество вожатых
total_people = n + m
total_bus = (total_people + 19) // 20 # эквивалентно math.ceil(total_people / 20)
Альтернативный подход с использованием оператора остатка:
n = int(input())
m = int(input())
total_people = n + m
total_bus = total_people // 20
if total_people % 20 != 0:
total_bus += 1
Задача №2: Расчет максимального количества гелевых ручек
Для решения этой задачи нужно определить, сколько ручек можно купить на 500 рублей со скидкой 10%.
Алгоритм решения:
- Рассчитаем цену одной ручки со скидкой:
price_after_discount = x * 0.9 - Разделим бюджет на цену со скидкой и возьмем целую часть результата
# Код для решения задачи
x = int(input()) # стоимость ручки в рублях
price_after_discount = x * 0.9
res = 500 // price_after_discount
Важное замечание: Так как цена со скидкой может быть нецелым числом, мы используем целочисленное деление, чтобы получить только целое количество ручек.
Детальное решение с примерами кода
Полное решение задачи №1
def calculate_min_buses():
"""
Функция для расчета минимального количества автобусов
"""
n = int(input()) # количество детей
m = int(input()) # количество вожатых
total_people = n + m
total_bus = (total_people + 19) // 20 # Оптимальный способ округления вверх
return total_bus
# Пример использования:
# total_bus = calculate_min_buses()
Полное решение задачи №2
def calculate_max_pens():
"""
Функция для расчета максимального количества ручек со скидкой
"""
x = int(input()) # стоимость ручки в рублях
price_after_discount = x * 0.9
res = int(500 / price_after_discount) # Приводим результат к целому числу
return res
# Пример использования:
# res = calculate_max_pens()
Примеры работы программ:
Для задачи №1:
- Входные данные:
n = 45,m = 3 - Расчет:
total_people = 48,48 / 20 = 2.4 - Результат:
total_bus = 3автобуса
Для задачи №2:
- Входные данные:
x = 50 - Расчет:
price_after_discount = 45,500 / 45 ≈ 11.11 - Результат:
res = 11ручек
Объяснение алгоритмов
Математика задачи №1
Ключевой момент в первой задаче - правильное округление. Вместо использования функции math.ceil() мы можем применить математический трюк:
(total_people + 19) // 20
Это работает потому что:
- Если
total_peopleкратно 20, то(20k + 19) // 20 = k - Если
total_people = 20k + r(где 1 ≤ r ≤ 19), то(20k + r + 19) // 20 = k + 1
Примеры:
40 // 20 = 2(ровно 2 автобуса)41 // 20 = 2, но(41 + 19) // 20 = 60 // 20 = 3
Математика задачи №2
Во второй задаче важно понимать, что:
- Скидка 10% означает, что новая цена = 90% от оригинальной
price_after_discount = x * 0.9- Максимальное количество ручек = бюджет / цена_со_скидкой
- Так как мы можем купить только целое количество ручек, используем целочисленное деление
Особенности округления:
- Мы должны использовать
//(целочисленное деление), а не обычное деление - Результат всегда будет округлен вниз до ближайшего целого числа
Тестирование программ
Тесты для задачи №1
# Тест 1: Ровное количество людей
n, m = 40, 0 # 40 детей, 0 вожатых
assert (40 + 0 + 19) // 20 == 2
# Тест 2: Нужно дополнительный автобус
n, m = 41, 0 # 41 детей, 0 вожатых
assert (41 + 0 + 19) // 20 == 3
# Тест 3: С вожатыми
n, m = 18, 2 # 18 детей, 2 вожатых
assert (18 + 2 + 19) // 20 == 2
# Тест 4: Граница вместимости
n, m = 19, 1 # 19 детей, 1 вожатых
assert (19 + 1 + 19) // 20 == 2
Тесты для задачи №2
# Тест 1: Ровное деление
x = 45 # цена 45 руб, со скидкой 40.5
assert 500 // (45 * 0.9) == 11
# Тест 2: Дорогие ручки
x = 100 # цена 100 руб, со скидкой 90
assert 500 // (100 * 0.9) == 5
# Тест 3: Дешевые ручки
x = 10 # цена 10 руб, со скидкой 9
assert 500 // (10 * 0.9) == 55
# Тест 4: Граница бюджета
x = 55 # цена 55 руб, со скидкой 49.5
assert 500 // (55 * 0.9) == 10
Эти тесты подтверждают корректность работы обоих алгоритмов на различных граничных случаях. Важно тестировать программы на экстремальных значениях, чтобы убедиться в их надежности.
Источники
- Официальная документация Python - Целочисленные операторы
- Mathematical algorithms for programming problems
- Python integer division and rounding
- Programming problems with mathematical solutions
Заключение
Для решения представленных задач на Python необходимо понимать базовые математические операции и принципы округления:
- Для расчета автобусов: Используйте формулу
(n + m + 19) // 20для эффективного округления вверх без дополнительных импортов - Для расчета ручек: Применяйте целочисленное деление
500 // (x * 0.9)для получения максимального количества товара при ограниченном бюджете - Тестируйте на граничных случаях: особенно когда количество людей близко к кратному вместимости автобусов или когда цена со скидкой близка к делителю бюджета
- Используйте целочисленные операции: они работают быстрее и точнее для таких задач
Эти алгоритмы демонстрируют важность понимания математических основ при программировании и показывают, как простые математические операции могут решать практические задачи.