Другое

Решение задач на Python: автобусы и ручки

Полное решение задач на Python с математическими алгоритмами. Расчет автобусов для лагеря и ручек со скидкой с примерами кода.

Решение задач на Python

Задача №1: Расчет минимального количества автобусов для летнего лагеря

Условие: В летний лагерь нужно отвезти n детей и m вожатых с помощью автобусов (значения считываются из входного потока в программе ниже). Максимальная вместимость каждого автобуса 20 человек. Допишите программу для вычисления минимального числа автобусов, необходимых для перевозки детей вместе с вожатыми. Результат сохраните в виде целого числа в переменной total_bus. На экран ничего выводить не нужно.

Задача №2: Расчет максимального количества гелевых ручек со скидкой

Условие: Гелевая ручка стоит x рублей (значение вводится из входного потока в программе ниже). Сегодня магазин предоставляет скидку в 10 % на каждую купленную ручку. Какое наибольшее количество таких ручек можно будет купить на 500 рублей? Результат сохраните в переменной res в виде целого числа.

P.S. На экран ничего выводить не нужно.

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

Содержание


Задача №1: Расчет минимального количества автобусов

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

Алгоритм решения:

  1. Рассчитаем общее количество людей: total_people = n + m
  2. Разделим общее количество людей на вместимость одного автобуса
  3. Используем округление вверх, так как даже если остался 1 человек, нужен дополнительный автобус
python
# Код для решения задачи
n = int(input())  # количество детей
m = int(input())  # количество вожатых

total_people = n + m
total_bus = (total_people + 19) // 20  # эквивалентно math.ceil(total_people / 20)

Альтернативный подход с использованием оператора остатка:

python
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%.

Алгоритм решения:

  1. Рассчитаем цену одной ручки со скидкой: price_after_discount = x * 0.9
  2. Разделим бюджет на цену со скидкой и возьмем целую часть результата
python
# Код для решения задачи
x = int(input())  # стоимость ручки в рублях

price_after_discount = x * 0.9
res = 500 // price_after_discount

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


Детальное решение с примерами кода

Полное решение задачи №1

python
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

python
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

python
# Тест 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

python
# Тест 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

Эти тесты подтверждают корректность работы обоих алгоритмов на различных граничных случаях. Важно тестировать программы на экстремальных значениях, чтобы убедиться в их надежности.


Источники

  1. Официальная документация Python - Целочисленные операторы
  2. Mathematical algorithms for programming problems
  3. Python integer division and rounding
  4. Programming problems with mathematical solutions

Заключение

Для решения представленных задач на Python необходимо понимать базовые математические операции и принципы округления:

  1. Для расчета автобусов: Используйте формулу (n + m + 19) // 20 для эффективного округления вверх без дополнительных импортов
  2. Для расчета ручек: Применяйте целочисленное деление 500 // (x * 0.9) для получения максимального количества товара при ограниченном бюджете
  3. Тестируйте на граничных случаях: особенно когда количество людей близко к кратному вместимости автобусов или когда цена со скидкой близка к делителю бюджета
  4. Используйте целочисленные операции: они работают быстрее и точнее для таких задач

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

Авторы
Проверено модерацией
Модерация