Мини-урок · перед практикой

Банковские счета

Словарь связывает имя клиента с целочисленным балансом.

Как к ней подойти

Потренируйтесь хранить пары «ключ - значение» и находить нужные записи в словаре.

Коротко о теме

Словарь связывает ключ со значением и позволяет быстро найти запись по ключу. Решите, что будет ключом, что значением и как обрабатывать отсутствующую запись. Для подсчётов удобно начинать с нуля.

Ключевая идея · Словарь балансов

Обычные операции меняют один-два баланса. Для INCOME обходим открытые счета; целочисленная формула не теряет точность. Перевод самому себе тоже работает.

Проверьте перед запуском

  • BALANCE не создаёт счёт.
  • Проценты начисляются только положительным балансам.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Словарь балансов

Обычные операции меняют один-два баланса. Для INCOME обходим открытые счета; целочисленная формула не теряет точность. Перевод самому себе тоже работает.

import sys
accounts = {}
for line in sys.stdin:
    parts = line.split()
    if not parts:
        continue
    command = parts[0]
    if command == 'BALANCE':
        print(accounts.get(parts[1], 'ERROR'))
    elif command == 'INCOME':
        p = int(parts[1])
        for name, balance in accounts.items():
            if balance > 0:
                accounts[name] += balance * p // 100
    elif command == 'TRANSFER':
        source, target, amount = parts[1], parts[2], int(parts[3])
        accounts[source] = accounts.get(source, 0) - amount
        accounts[target] = accounts.get(target, 0) + amount
    else:
        name, amount = parts[1], int(parts[2])
        if command == 'WITHDRAW':
            amount = -amount
        accounts[name] = accounts.get(name, 0) + amount

Время: Ожидаемое O(Q + IC), Q — число команд, I — число начислений, C — число клиентов. Память: O(C + L), L — длина текущей команды.

Другой способ: Список счетов и линейный поиск

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

import sys
names, balances = [], []
def account(name):
    if name not in names:
        names.append(name)
        balances.append(0)
    return names.index(name)
for line in sys.stdin:
    p = line.split()
    if not p:
        continue
    if p[0] == 'BALANCE':
        print(balances[names.index(p[1])] if p[1] in names else 'ERROR')
    elif p[0] == 'INCOME':
        rate = int(p[1])
        for i in range(len(names)):
            if balances[i] > 0:
                balances[i] += balances[i] * rate // 100
    elif p[0] == 'TRANSFER':
        i, j = account(p[1]), account(p[2])
        balances[i] -= int(p[3])
        balances[j] += int(p[3])
    else:
        i = account(p[1])
        balances[i] += int(p[2]) * (1 if p[0] == 'DEPOSIT' else -1)

Время: O(QC). Память: O(C + L).