C/C++

Можете подсказать по задаче или дать алгоритм задачи, код опять же не нужен

В столовой одного известного Завода вот-вот начнётся обед. На обеде есть три гарнира — макарошки, пюрешка и греча. К гарнирам, конечно же, полагается горячее. Горячих блюд тоже три (ну и совпадение!) — сосиски, котлетки и кура. На раздаче сегодня стоит добрая повариха Алевтина Мстиславовна. Она немного ленива, но очень любит заводчан, вот перед ней и встала задача. Итак, для начала поведаем вам прописные истины: макарошки лучше сочетать с сосисками, пюрешку с котлетками, а гречу с курой. Человек, у которого на обед одно из этих трёх сочетаний, будет счастливым, в противном случае счастливым он не будет. На раздаче в очередь выстроились n заводчан. По очереди они будут подходить к Алевтине и называть ей гарнир, который они хотят. У Алевтины на раздаче будут все три гарнира, а также одно из горячих блюд. Заводчанину она будет выдавать гарнир, который он хочет, а также то горячее которое сейчас на раздаче. Кроме того, за всё время Алевтина готова не более чем k раз сходить в Горячий Цех и заменить горячее блюдо на раздаче на любое другое. Естественно, в начале она вольна принести на раздачу любое горячее блюдо, которое захочется. Алевтина дружит со всеми заводчанами и уже заранее знает кому какой гарнир хочется. Всей информацией она поделилась с Вами. Алевтина добра душой и хочет, чтобы как можно больше заводчан были счастливы благодаря сочетанию гарнира и горячего. Ваша задача — сказать какое наибольшее число заводчан могут оказаться счастливыми при заданном ограничении на число замен горячего блюда на раздаче. Не подведите Алевтину! Формат входных данных В первой строке входных даны целые числа n и k ( 1 ⩽ n ⩽ 10 5 , 0 ⩽ k ⩽ 20 ). В следующих n строках даны предпочтения по гарнирам в том порядке, в котором заводчане стоят в очереди, по одному на строке. Предпочтение описано одним из трёх символов: «M», «P» или «G» — макарошки, пюрешка или гречка соответственно.
Формат выходных данных
Выведите какое наибольшее число заводчан будут счастливыми после обеда.
Примеры
Входные данные
5 1
M
M
G
M
P
Выходные данные
4
Примечания
Запасы гарниров и горячих блюд на раздаче считайте неограниченными.

Разберём пример. В примере последовательность желаемых гарниров такая: макарошки, макарошки, греча, макарошки, пюре; Алевтина 1 раз может поменять горячее на раздаче. Возможный вариант того, как ей поступить, следующий: сначала принести сосиски, раздать их 4-ём людям (соответственно первый, второй и четвёртый человек будут счастливы), а затем заменить горячее на котлетки (и тогда пятый человек тоже будет счастлив). Таким образом Алевтина осчастливит 4 заводчан.
Я бы начал с анализа длин непрерывных последовательностей из одного гарнира и сложил бы их в отдельный список по убыванию длины (храним: символ, стартовую позицию, длину).
Если длина этого списка не превосходит k + 1, то Алевтина осчастливит всех.
Если же длина больше, то излишком придётся пожертвовать. Понятно, что этот излишек будет в конце списка последовательностей, но нельзя просто так взять и отбросить хвост маленьких последовательностей. Последовательности нужно приоритизировать: тем, которые стоят между одинаковыми блюдами, назначить наивысший приоритет, остальным - ниже. Низкий приоритет выбывает первым.

Это даст более-менее годное решение, но не оптимальное. Для оптимального нужно ещё понимать полный объём потерь, если не менять блюдо. Поэтому нужно сравнить каждую последовательность по длине со следующей за ней.

Для примера из задания.
Сортированный список (эффект от незамены гарнира: отрицательный - плохо, положительный - хорошо):
 Гарнир Начало Длина Эффект
M 0 2 -2 + 1 = -1 - это если сразу поставить гречку
G 2 1 -1 + 1 = 0 - потеряем желающего гречки, но приобретём следующего за ним
M 3 1 -1 + 0 = -1 - оставление гречки не осчастливит желающего пюре
P 3 1 -1 + 0 = -1 - последний клиент
Оставляем k (т.е. одну) последовательность. Её длина = 2.
Подсписок остатков - остальные три последовательности.
Думаю, что можно выкинуть из подсписка остатков те, у которых эффект отрицательный. Останется одна с нулём, её длина = 1, её не выкидываем.
И надо ещё оставить последовательность, идущую после неё, т.к. мы не поменяли гарнир. Её длина тоже равна 1.

После этого у тебя останется набор интервалов, надо будет просуммировать их длины. Итого 2 + 1 + 1 = 4.

Попробуй рассмотреть кейсы посложнее.
Например, надо что-то придумать для случая:
 MMGPMMMG
k = 1
Здесь можно послать подальше (в конец очереди) обоих клиентов G и P, получив в итоге 5 "макаронников" и одного с гречкой, итого 6. Но алгоритм посчитает так:
 Гарнир Начало Длина Эффект
M 0 2 -1
G 2 1 -1
P 3 1 -1
M 4 3 -3
G 7 1 -1
Берём k + 1 = 2 топовых записи, это "макаронники" 3 + 2 = 5 чел.
Все остальные имеют отрицательный эффект и будут выкинуты.
Игорь Куданов
Игорь Куданов
54 053
Лучший ответ
Борабора Борабора да, вроде идея не плохая, сейчас попробую
Борабора Борабора ну так M вторая отрицательная, но мы же её добавляем
Борабора Борабора 1. Создайте массив для хранения информации о каждом гарнире и горячем блюде. Например, для макарошек можно использовать элементы [1,1,0], где 1 - это индекс для сосисок, 1 - для котлеток и 0 - для куры. Аналогично для пюрешки и гречки.
2. Создайте другой массив для хранения количества заводчан, которые хотят получить каждый гарнир. Например, если заводчанин хочет макарошки с сосисками, то его массив будет [1].
3. Пройдите по очереди заводчан и для каждого запрашиваемого гарнира проверьте, имеется ли в наличии горячее блюдо, соответствующее этому гарниру. Если имеется, то добавьте элемент в третий массив, соответствующий количеству заводчан, желающих получить этот гарнир с этим горячим блюдом. Если горячее блюдо отсутствует, то пропустите этот шаг.
Борабора Борабора 4. После того, как очередь закончена, пройдитесь по каждому элементу третьего массива и определите, какое горячее блюдо лучше всего подходит для этого гарнира. Если количество заводчан, желающих получить это горячее блюдо, превышает количество доступных горячих блюд, то выберите горячее блюдо с наибольшим количеством желающих.

5. Вернитесь к первому шагу и передайте горячее блюдо, которое было выбрано на предыдущем шаге, на раздачу.

6. Повторите шаги 2-5 для всех трех гарниров, чтобы определить, какое горячее блюдо будет подано на обед.
Это предлагал другой человек
Azizbek Raximov а как насчет примера
18 2
MMPMMPPPPMGGGMMMMM
Юрий Сушков жадный алгоритм и динамическое программирование это две абсолютно разные вещи.
Жадник - результат здесь и сейчас.
Динама - оптимальный результат за набор шагов.
Эта задача может быть решена с помощью динамического программирования. Мы можем создать массив dp, где dp[i][j] означает максимальное количество счастливых заводчан, которых можно получить, если мы рассматриваем первые i заводчан и меняем горячее блюдо j раз. Мы можем инициализировать dp[0][j] = 0 для всех j от 0 до k. Затем мы можем обновлять значения dp[i][j] для каждого i от 1 до n и каждого j от 0 до k следующим образом:
- Если текущий заводчанин хочет гарнир, который сочетается с текущим горячим блюдом, то dp[i][j] = max(dp[i][j], dp[i-1][j] + 1).
- В противном случае, если j > 0, то dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 1).
- Кроме того, dp[i][j] = max(dp[i][j], dp[i-1][j]).
В конце ответом будет max(dp[n][j]) для всех j от 0 до k.
Цой Иннокентий
Цой Иннокентий
25 860
Игорь Куданов Динамическое программирование - это не алгоритм, а способ его реализации, снижающий вычислительную асимптотику за счёт повышенного расхода памяти.
Хотя, кому я это говорю...

P.S. И что-то ты опоздал. Твой нейрохозяин будет недоволен. Быстрее стучи по кнопкам, раб не должен отдыхать до захода солнца.
Владимир Кузьмин можете подсказать, пожалуйста, как хранить текущее горячее блюдо?
Юрий Сушков Динамическое программирование - это не способ реализации:)
Ты решил эту задачу?
Улан Токтосунов Какие ты вообще решил задачи с отбора?
Борабора Борабора а ты по этим задачам у тебя есть идеи?
Саша Попович привет, дай тг/вк/инстаграм могу скинуть что надо
Кириллу Иванову
Задача не очень сложная. Её надо решить через Алгоритм Хиршберга. . Советую ознакомиться с ним и всё встанет на свои места
Борабора Борабора не очень понимаю как эту задачу можно решить Алгоритм Хиршберга, можешь объяснить?
Борабора Борабора умоляю ответь