Задачи
March 17
Задача. Оптимальное заполнение мешков
Даны n мешков и два целочисленных массива capacity и rocks.
- i-й мешок может вмещать максимум камней вместимостью capacity[i] и содержит rocks[i] камней.
- Также дано целое число additionalRocks - количество дополнительных камней, которые можно поместить в любой из мешков.
Необходимо вернить МАКСИМАЛЬНОЕ количество мешков, которые могут иметь полную вместимость после размещения дополнительных камней в некоторых мешках.
Пояснение: по одному камню кладем в 1й и 2й мешок. Тогда количество камней в каждом мешке равно [2,3,4,4]. И первые 3 мешка полностью заполнены.
Разбор
- На 1м этапе найдем размер свободного места в мешках.
- На 2м этапе отсортируем массив по возрастанию свободных мест в мешках.
- На 3м этапе будем использовать дополнительные камни для заполнения мешков пока это возможно.
- Вернем количество полностью заполненных мешков.
Реализация
static int MaxBags(int[] capacity, int[] rocks, int additionalRocks) { for (int i = 0; i < capacity.Length; i++) { capacity[i] -= rocks[i]; } Array.Sort(capacity); int result = 0; for (int i = 0; i < capacity.Length; i++) { if (capacity[i] > 0 && additionalRocks == 0) return result; if (capacity[i] == 0) { result++; } else if (capacity[i] <= additionalRocks) { additionalRocks -= capacity[i]; result++; } } return result; }
https://gist.github.com/unilecs/8ab18a06ecff6e47d48402499c90ec75
Python:
https://gist.github.com/unilecs/ebf505863c07ff797cf3c59a0b9aa014
Play-test (C#):
https://dotnetfiddle.net/kaLbf9