Смена в прокате коньков
Условие
В пункте проката коньков идёт смена. За смену фиксируют события: кто-то пытается взять пару, кто-то возвращает.
Пары коньков одинаковые, важны только количества: сколько пар всего, сколько сейчас занято, сколько денег в кассе, сколько было отказов и какой максимум занятых пар случался за смену.
Правила событий:
take— если есть свободная пара, её выдают, в кассу добавляют цену аренды. Если свободных пар нет — это отказ, касса и занятость не меняются.back— если есть занятые пары, одну пару возвращают (занятость уменьшается). Если занятых пар нет — событие полностью игнорируется.
Нужно вывести итоговый отчёт.
Формат ввода:
- В первой строке целое
k— сколько пар коньков всего (1 ≤ k ≤ 100). - Во второй строке целое
p— цена аренды одной пары (1 ≤ p ≤ 1000). - В третьей строке целое
n— число событий (1 ≤ n ≤ 200). - Далее идут
nстрок, в каждой строке одно слово:takeилиback.
Формат вывода: Выведите ровно 3 строки:
касса: Xотказы: Yмаксимум занятых: Z
Ограничения:
- Все входные значения даны по одному на строке.
- 1 ≤ k ≤ 100, 1 ≤ p ≤ 1000, 1 ≤ n ≤ 200.
Пример: Ввод:
2
100
6
take
take
take
back
back
back
Вывод:
касса: 200
отказы: 1
максимум занятых: 2Как решать — идея подхода
Приём: Симуляция (пошаговое моделирование)
Ключевое наблюдение: пары коньков не отличаются, поэтому состояние проката в любой момент описывается всего несколькими числами — сколько пар занято сейчас, сколько денег в кассе, сколько было отказов и какой максимум занятых встречался. Значит, можно просто «проиграть» все события по очереди.
Приём: симуляция (пошаговое моделирование). Он работает, потому что каждое событие зависит только от текущего состояния, а ограничения маленькие (n до 200), так что один проход хватит.
План решения:
- Считай k (всего пар), p (цена), n (число событий).
- Заведи переменные:
busy = 0,cash = 0,refusals = 0,max_busy = 0. - Для каждого из n слов:
- Если это
take: - если
busy < k, то выдаём пару:busy += 1,cash += p, обновляем максимумmax_busy = max(max_busy, busy); - иначе свободных нет:
refusals += 1. - Если это
back: - если
busy > 0, то возвращают:busy -= 1; - иначе игнорируем событие.
- Выведи 3 строки точно в нужном формате.
Сложность: O(n) по времени и O(1) по памяти.
Частая ошибка: уменьшать busy на back, даже когда busy == 0 (получится отрицательная занятость). Ещё одна — обновлять max_busy не после успешного take, а всегда.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать
- На программиста по олимпиаде: путь по классам — что даёт диплом, куда с ним берут на ИТ-направления и почему решает 9 класс