Перед тобой расписание тренировок Скриптоши на 12 дней. Каждый день занят одним из трёх типов упражнений. Профессор хочет изменить расписание так, чтобы робот тренировал один и тот же навык по нескольку дней подряд. Так у него будет больше шансов на успех. В расписании разрешается заменить не больше трёх дней. Какие из них надо поменять, чтобы робот максимально долго тренировал один навык без перерыва?
Нужен сам распорядок — последовательность из 121212 дней (например, строка из букв типа A,B,C или список из 12 элементов). Пришлите её, и я укажу, какие дни менять. Пока можно воспользоваться таким быстрым методом (самостоятельно или чтобы я его применил): 1. Обозначим длину n=12\,n=12n=12, разрешённые замены k=3\,k=3k=3. Пусть последовательность — a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an, набор навыков T={t1,t2,t3}T=\{t_1,t_2,t_3\}T={t1,t2,t3}. 2. Для каждого навыка t∈Tt\in Tt∈T найдём наибольший отрезок [l,r][l,r][l,r] такой, что #{i∈[l,r]:ai≠t}≤k.
\#\{i\in[l,r]: a_i\ne t\}\le k. #{i∈[l,r]:ai=t}≤k.
Это можно сделать скользящим окном: держим два указателя l,rl,rl,r, увеличиваем rrr, считаем количество позиций с ai≠ta_i\ne tai=t; когда оно превышает kkk, сдвигаем lll. 3. Для найденного лучшего отрезка для некоторого ttt дни, которые нужно заменить — это все индексы i∈[l,r]i\in[l,r]i∈[l,r] такие, что ai≠ta_i\ne tai=t. Число таких индексов ≤k\le k≤k. Длина максимальной подряд идущей тренировки будет r−l+1r-l+1r−l+1. 4. Выберите среди трёх навыков максимальный отрезок (в случае равенства можно брать любой или дополнительное правило, например, минимальный номер дня). Сложность алгоритма: O(∣T∣⋅n)=O(n)O(|T|\cdot n)=O(n)O(∣T∣⋅n)=O(n) при фиксированном TTT. Пришлите расписание (строку или список 12 значений) — я сразу верну конкретные номера дней для замены и итоговую длину подряд.
Пока можно воспользоваться таким быстрым методом (самостоятельно или чтобы я его применил):
1. Обозначим длину n=12\,n=12n=12, разрешённые замены k=3\,k=3k=3. Пусть последовательность — a1,a2,…,ana_1,a_2,\dots,a_na1 ,a2 ,…,an , набор навыков T={t1,t2,t3}T=\{t_1,t_2,t_3\}T={t1 ,t2 ,t3 }.
2. Для каждого навыка t∈Tt\in Tt∈T найдём наибольший отрезок [l,r][l,r][l,r] такой, что
#{i∈[l,r]:ai≠t}≤k. \#\{i\in[l,r]: a_i\ne t\}\le k.
#{i∈[l,r]:ai =t}≤k. Это можно сделать скользящим окном: держим два указателя l,rl,rl,r, увеличиваем rrr, считаем количество позиций с ai≠ta_i\ne tai =t; когда оно превышает kkk, сдвигаем lll.
3. Для найденного лучшего отрезка для некоторого ttt дни, которые нужно заменить — это все индексы i∈[l,r]i\in[l,r]i∈[l,r] такие, что ai≠ta_i\ne tai =t. Число таких индексов ≤k\le k≤k. Длина максимальной подряд идущей тренировки будет r−l+1r-l+1r−l+1.
4. Выберите среди трёх навыков максимальный отрезок (в случае равенства можно брать любой или дополнительное правило, например, минимальный номер дня).
Сложность алгоритма: O(∣T∣⋅n)=O(n)O(|T|\cdot n)=O(n)O(∣T∣⋅n)=O(n) при фиксированном TTT.
Пришлите расписание (строку или список 12 значений) — я сразу верну конкретные номера дней для замены и итоговую длину подряд.