Как пройти уровень "накорми чудищ" в игре мастер программирования?

22 Фев в 19:40
57 +1
0
Ответы
1
Нужно точнее понимать правила уровня (что такое «кормить»: один кусок еды на одно чудовище, сумма кусочков, требования к порядку и т.п.). Если не можешь — пришли короткое описание (массив аппетитов и массив размеров еды или скрин).
Ниже — решения для двух типичных вариантов.
1) Один кусок еды отвечает за одно чудовище (кусок пригоден, если его размер ≥ аппетит). Цель — накормить всех или максимальное число.
- Идея: жадно сопоставлять «самому ненасытному подходящий кусок» неэффективно; правильно — сортировать оба списка и матчить маленькие с маленькими.
- Пусть аппетиты A=[a1,…,an]A = [a_1,\dots,a_n]A=[a1 ,…,an ], размеры еды S=[s1,…,sm]S = [s_1,\dots,s_m]S=[s1 ,…,sm ]. Отсортируйте по неубыванию.
- Алгоритм (двух указателей):
1. Отсортировать AAA и SSS.
2. Завести указатели i=1i=1i=1 для AAA и j=1j=1j=1 для SSS.
3. Пока i≤ni\le ni≤n и j≤mj\le mj≤m: если sj≥ais_j \ge a_isj ≥ai — кормим aia_iai , увеличить iii и jjj; иначе j++j++j++ (ищем больший кусок).
4. Ответ: накормлено i−1i-1i−1 чудовищ; все накормлены, если i=n+1i=n+1i=n+1.
- Сложность: сортировка O(nlog⁡n+mlog⁡m)O(n\log n + m\log m)O(nlogn+mlogm), проход O(n+m)O(n+m)O(n+m).
Пример: A=[2,4,3]A=[2,4,3]A=[2,4,3], S=[1,3,5]S=[1,3,5]S=[1,3,5] → после сортировки A=[2,3,4]A=[2,3,4]A=[2,3,4], S=[1,3,5]S=[1,3,5]S=[1,3,5]: пропускаем 111, 3≥23\ge23≥2 кормим, 5≥35\ge35≥3 кормим, осталось одно аппетит 444 без еды.
2) Кусочки суммируются (чтобы накормить чудовище надо дать несколько кусочков, суммарный размер ≥ аппетит). Цель — накормить всех или макс. число.
- Это задача о разложении/распределении — в общем NP-трудная при больших размерах. При небольших ограничениях можно использовать динамическое программирование (битсет/knapsack) по суммам.
- Подход (для маленьких сумм): отсортировать чудовищ по аппетиту по убыванию; для каждого чудовища пытаться собрать из оставшихся кусочков подмножество суммой ≥ его аппетита (subset-sum), если получилось — удалить эти кусочки и перейти к следующему; реализуется через битсеты или DP.
- Если суммарная длина еды T=∑ST=\sum ST=∑S и TTT невелико (например T≤105T\le 10^5T≤105), можно поддерживать битсет возможных сумм и для выбора конкретных кусочков восстанавливать набор.
- Если количества большие — думать о жадных эвристиках (давать большие куски большим аппетитам) или о ILP/брютах с отсечением.
Если опишешь точные правила уровня (формат входных данных: массивы, ограничения на размеры и т. д.), дам конкретный пошаговый алгоритм и код/псевдокод.
22 Фев в 19:40
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир