Подсчёт дефицита ресурсов в Python: квоты и суммы заявок

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.

Оценка квот вычислительного пула

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

Что уже дано

Готовая заготовка считывает JSON-данные из стандартного ввода, вызывает функцию evaluate_quota(pool_limits, requests) и выводит результат в стандартный вывод в формате JSON.

Что нужно сделать

Реализуйте функцию evaluate_quota(pool_limits: dict[str, int], requests: list[dict[str, int]]) -> dict.

Функция принимает два аргумента:

  • pool_limits — доступное количество ресурсов в пуле;
  • requests — список заявок, где каждая заявка содержит требуемые количества ресурсов для отдельной задачи.

Все количества ресурсов во входных данных неотрицательны (могут быть равны нулю). Если ресурс не упомянут в пуле или в заявке, его количество считается равным 0.

Правила проверки и расчёта:

  1. Все заявки суммируются по каждому ресурсу перед сопоставлением с пулом.
  2. Пакет считается полностью выполнимым ("is_fulfilled": True), если суммарный спрос по каждому ресурсу не превышает доступный лимит в пуле (включая случай, когда список requests пуст).
  3. Если пакет выполним:
  • remaining_pool содержит разность между запасом пула и суммарным запросом по каждому ресурсу. В итоговый словарь включаются только строго положительные остатки (включая ресурсы пула, которые вообще не запрашивались). Нулевые остатки отбрасываются;
  • поля shortage и satisfied_quota принимают значение None (null в JSON).
  1. Если хотя бы по одному ресурсу суммарный запрос превышает объём пула, пакет не может быть выполнен ("is_fulfilled": False):
  • remaining_pool принимает значение None (null в JSON);
  • shortage содержит только те ресурсы, по которым возник дефицит, а значением является строго положительная разность между суммарным спросом и лимитом пула;
  • satisfied_quota содержит покомпонентный минимум между лимитом пула и суммарным спросом для каждого ресурса, но только с теми значениями, которые строго больше нуля.

Функция должна возвращать словарь с четырьмя ключами: "is_fulfilled", "remaining_pool", "satisfied_quota" и "shortage".

Ввод и вывод

Программа взаимодействует с окружением через стандартные потоки stdin и stdout.

Формат ввода

В stdin передаётся JSON-объект с двумя полями:

  • "pool" — объект вида {"resource_name": int, ...};
  • "requests" — массив объектов вида [{"resource_name": int, ...}, ...]. Допускается пустой список [].

Формат вывода

Программа выводит в stdout одну JSON-строку с отсортированными ключами, содержащую поля is_fulfilled, remaining_pool, satisfied_quota и shortage.

Пример

Ввод
{"pool":{"cpu":64,"gpu":4,"ram_gb":256},"requests":[{"cpu":16,"gpu":2,"ram_gb":64},{"cpu":32,"gpu":1,"ram_gb":128}]}
Вывод
{"is_fulfilled":true,"remaining_pool":{"cpu":16,"gpu":1,"ram_gb":64},"satisfied_quota":null,"shortage":null}
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи