08. Учёт остатков на складе
Словарь Dictionary<TKey, TValue>
Что хранит. Хранит пары «ключ — значение». Ключи уникальны, значения могут повторяться. Ключ обозначает запись и не является её порядковым номером.
Для чего используют. Подходит для настроек, остатков товара, счётчиков посещений: значение нужно быстро находить по имени или идентификатору.
Основные операции
| Запись на C# | Назначение |
d[key] = value | Создать запись или заменить прежнее значение. |
d.Add(key, value) | Добавить только новый ключ; повторный ключ вызывает ошибку. |
d.TryGetValue(key, out value) | Проверить наличие и получить значение; возвращает true или false. |
d.ContainsKey(key) | Проверить наличие ключа. |
d.Remove(key) | Удалить запись; вернуть false, если ключа нет. |
d.Count | Количество ключей. |
d.Keys | Ключи для перебора; нужный порядок задавайте отдельно. |
Пример
Для примера нужны using System; и using System.Collections.Generic;. Код выполняется внутри Main.
Dictionary<string, int> stock = new Dictionary<string, int>();
stock["tea"] = 2;
stock["tea"] += 1; // Изменяем существующую запись.
int amount;
if (stock.TryGetValue("tea", out amount))
Console.WriteLine(amount);
Console.WriteLine(stock.ContainsKey("water"));
Вывод:
3
False
Важно. Чтение d[key] требует существующего ключа. Значение 0 и отсутствие записи — разные случаи. Не полагайтесь на порядок обхода словаря.
Для этой задачи
- Запас. Храните остатки в Dictionary<int, long>. Сначала проверьте возможность выдачи, затем уменьшайте запас.
Изначально склад пуст. Приход увеличивает запас товара. Выдача разрешена, только если запас не меньше запрошенного количества. При отказе запас не меняется. Нулевой запас и отсутствие товара дают одинаковый ответ на запрос STOCK.
Команды
| Команда | Действие и ответ |
ARRIVE id amount | Увеличить запас на amount. Ответ OK. |
TAKE id amount | Уменьшить запас на amount, если его достаточно: OK. Иначе REJECTED. |
STOCK id | Вывести текущий запас или 0, если товара нет. |
Входные данные
Первая строка содержит q. Далее идут q команд, по одной в строке.
Выходные данные
Выведите по одной строке ответа на каждую команду согласно таблице.
Не выводите приглашения к вводу и пояснения. Служебные слова в ответах пишите в указанном регистре.
Ограничения
1 ≤ q ≤ 100000; идентификатор id от 1 до 10⁹; количество amount от 1 до 10⁹. Накопленный запас может превышать 2³¹ − 1.
| № | Входные данные | Выходные данные |
|
1
|
8
STOCK 10
ARRIVE 10 5
TAKE 10 6
STOCK 10
TAKE 10 5
STOCK 10
TAKE 20 1
STOCK 20
|
0
OK
REJECTED
5
OK
0
REJECTED
0
|
|
2
|
5
ARRIVE 7 1000000000
ARRIVE 7 1000000000
ARRIVE 7 1000000000
TAKE 7 1
STOCK 7
|
OK
OK
OK
OK
2999999999
|
Напишите программу
Auto