В столовой одного известного Завода вот-вот начнётся обед. На обеде есть три гарнира — макарошки, пюрешка и греча. К гарнирам, конечно же, полагается горячее. Горячих блюд тоже три (ну и совпадение!) — сосиски, котлетки и кура. На раздаче сегодня стоит добрая повариха Алевтина Мстиславовна. Она немного ленива, но очень любит заводчан, вот перед ней и встала задача. Итак, для начала поведаем вам прописные истины: макарошки лучше сочетать с сосисками, пюрешку с котлетками, а гречу с курой. Человек, у которого на обед одно из этих трёх сочетаний, будет счастливым, в противном случае счастливым он не будет. На раздаче в очередь выстроились 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 заводчан.
C/C++
Можете подсказать по задаче или дать алгоритм задачи, код опять же не нужен
Я бы начал с анализа длин непрерывных последовательностей из одного гарнира и сложил бы их в отдельный список по убыванию длины (храним: символ, стартовую позицию, длину).
Если длина этого списка не превосходит k + 1, то Алевтина осчастливит всех.
Если же длина больше, то излишком придётся пожертвовать. Понятно, что этот излишек будет в конце списка последовательностей, но нельзя просто так взять и отбросить хвост маленьких последовательностей. Последовательности нужно приоритизировать: тем, которые стоят между одинаковыми блюдами, назначить наивысший приоритет, остальным - ниже. Низкий приоритет выбывает первым.
Это даст более-менее годное решение, но не оптимальное. Для оптимального нужно ещё понимать полный объём потерь, если не менять блюдо. Поэтому нужно сравнить каждую последовательность по длине со следующей за ней.
Для примера из задания.
Сортированный список (эффект от незамены гарнира: отрицательный - плохо, положительный - хорошо):
Подсписок остатков - остальные три последовательности.
Думаю, что можно выкинуть из подсписка остатков те, у которых эффект отрицательный. Останется одна с нулём, её длина = 1, её не выкидываем.
И надо ещё оставить последовательность, идущую после неё, т.к. мы не поменяли гарнир. Её длина тоже равна 1.
После этого у тебя останется набор интервалов, надо будет просуммировать их длины. Итого 2 + 1 + 1 = 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 чел.Все остальные имеют отрицательный эффект и будут выкинуты.
Эта задача может быть решена с помощью динамического программирования. Мы можем создать массив 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.
- Если текущий заводчанин хочет гарнир, который сочетается с текущим горячим блюдом, то 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.
Игорь Куданов
Динамическое программирование - это не алгоритм, а способ его реализации, снижающий вычислительную асимптотику за счёт повышенного расхода памяти.
Хотя, кому я это говорю...
P.S. И что-то ты опоздал. Твой нейрохозяин будет недоволен. Быстрее стучи по кнопкам, раб не должен отдыхать до захода солнца.
Хотя, кому я это говорю...
P.S. И что-то ты опоздал. Твой нейрохозяин будет недоволен. Быстрее стучи по кнопкам, раб не должен отдыхать до захода солнца.
Владимир Кузьмин
можете подсказать, пожалуйста, как хранить текущее горячее блюдо?
Юрий Сушков
Динамическое программирование - это не способ реализации:)
Ты решил эту задачу?
Улан Токтосунов
Какие ты вообще решил задачи с отбора?
Борабора Борабора
а ты по этим задачам у тебя есть идеи?
Саша Попович
привет, дай тг/вк/инстаграм могу скинуть что надо
Кириллу Иванову
Кириллу Иванову
Задача не очень сложная. Её надо решить через Алгоритм Хиршберга. . Советую ознакомиться с ним и всё встанет на свои места
Борабора Борабора
не очень понимаю как эту задачу можно решить Алгоритм Хиршберга, можешь объяснить?
Борабора Борабора
умоляю ответь
Похожие вопросы
- Можете пожалуйста решить ещё задачу на с++. Письменно алгоритмом или код на с++.
- Можете помочь с задачей на с++. Можете сказать хотя бы просто алгоритм решения.
- Помогите решить задачу,код должен выйти не таким сложным,но что то не выходит
- Здравствуйте, подскажите у меня совсем ущербный алгоритм. Мне его как-то оптимизировать или что-то другое писать
- Можете помочь решить задачу по программированию.
- Составьте алгоритм и напишите программу вычисления суммы n членов ряда согласно условию задачи
- Ещё один вопрос. Можете написать алгоритм к этой задаче(можно без кода, просто текстом)
- Помогите с кодом задачи c++. задача на фото
- Написать код для задачи C++
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++, динамическое программирование)?
2. Создайте другой массив для хранения количества заводчан, которые хотят получить каждый гарнир. Например, если заводчанин хочет макарошки с сосисками, то его массив будет [1].
3. Пройдите по очереди заводчан и для каждого запрашиваемого гарнира проверьте, имеется ли в наличии горячее блюдо, соответствующее этому гарниру. Если имеется, то добавьте элемент в третий массив, соответствующий количеству заводчан, желающих получить этот гарнир с этим горячим блюдом. Если горячее блюдо отсутствует, то пропустите этот шаг.
5. Вернитесь к первому шагу и передайте горячее блюдо, которое было выбрано на предыдущем шаге, на раздачу.
6. Повторите шаги 2-5 для всех трех гарниров, чтобы определить, какое горячее блюдо будет подано на обед.
Это предлагал другой человек
18 2
MMPMMPPPPMGGGMMMMM
Жадник - результат здесь и сейчас.
Динама - оптимальный результат за набор шагов.