К списку задач
Легко Решено: 0 Процент решений: 0%

Фасад оформления заказа

Скрыть проверки наличия и подсчёт цены за одной простой командой оформления заказа.

Чему вы научитесь

  • Прятать несколько подсистем за одним вызовом
  • Проверять наличие перед оплатой
  • Объединять повторяющиеся строки корзины по товару

Условие

Паттерн facade даёт простой вход к сложной подсистеме. Вызов checkout в магазине скрывает две подсистемы: инвентарь и список цен.

Товары пронумерованы от 0 до n − 1. stock[i] — это количество единиц товара i в наличии, а prices[i] — его цена. Корзина — это список строк [item, quantity]; один и тот же товар может встречаться в нескольких строках.

checkout(stock, prices, cart) должен:

  1. Проверить инвентарь: если суммарное количество любого товара в корзине больше его запаса, заказ не проходит.
  2. Иначе вернуть общую стоимость корзины.

Реализуйте checkout_facade(stock, prices, cart).

Input

stock, prices: по n значений в каждом.

cart: строки [item, quantity].

Output

Верните общую стоимость, или -1, если для какого-либо товара не хватает запаса.

Ограничения

1 ≤ n ≤ 1,000

0 ≤ stock[i], prices[i] ≤ 100,000; 0 ≤ строк корзины ≤ 1,000; 1 ≤ quantity ≤ 1,000

Примеры

Пример 1
Ввод:
cart = [
    [0, 2],
    [2, 4]
]
stock = [5, 2, 10]
prices = [3, 20, 1]

Ожидаемый вывод:
expected = 10
Ввод:
std::vector<std::vector<long long>> cart = {
    {0, 2},
    {2, 4}
};
std::vector<long long> stock = {5, 2, 10};
std::vector<long long> prices = {3, 20, 1};

Ожидаемый вывод:
long long expected = 10;
Ввод:
long[][] cart = new long[][] {
    new long[] {0, 2},
    new long[] {2, 4}
};
long[] stock = new long[] {5, 2, 10};
long[] prices = new long[] {3, 20, 1};

Ожидаемый вывод:
long expected = 10;

Пояснение

Оба товара есть в наличии. 2 × 3 + 4 × 1 = 10.

Пример 2
Ввод:
cart = [
    [1, 1],
    [1, 2]
]
stock = [5, 2]
prices = [3, 20]

Ожидаемый вывод:
expected = -1
Ввод:
std::vector<std::vector<long long>> cart = {
    {1, 1},
    {1, 2}
};
std::vector<long long> stock = {5, 2};
std::vector<long long> prices = {3, 20};

Ожидаемый вывод:
long long expected = -1;
Ввод:
long[][] cart = new long[][] {
    new long[] {1, 1},
    new long[] {1, 2}
};
long[] stock = new long[] {5, 2};
long[] prices = new long[] {3, 20};

Ожидаемый вывод:
long expected = -1;

Пояснение

Товар 1 встречается дважды, всего 3 единицы, но в наличии только 2, поэтому заказ не проходит: -1.

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Сначала сложите количество каждого товара по всем строкам корзины.

Подсказка 2

Сравните эти суммы с наличием до расчёта любой цены.

Подсказка 3

Если какого-то товара не хватает, сразу верните -1.

Ожидаемая сложность

время O(n + строк корзины), доп. память O(n)

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

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