Задание №24 - Метод двух указателей | Информатика ЕГЭ 2024

  Рет қаралды 12,978

Информатика ЕГЭ - Лёня Шастин

Информатика ЕГЭ - Лёня Шастин

Күн бұрын

Пікірлер: 51
@Benhooky
@Benhooky 10 ай бұрын
Мне еще нравится ребятам объяснять через окно, в целом идея схожая, но будто бы сделать буфер - окно и потом его обрезать может быть попонятнее, хотя, конечно, метод двух указателей лучше потому что это база для литкода ) Спасибо за контент!
@iceak001
@iceak001 10 ай бұрын
с первого раза все у вас понимаю) лёня, спасибо
@babysya696
@babysya696 6 ай бұрын
спасибо, Лёня, за разбор!
@unthinkable1854
@unthinkable1854 10 ай бұрын
Большое спасибо Вам за видео, Леонид!
@Vadim-yz2bd
@Vadim-yz2bd 9 ай бұрын
Здравствуйте, спасибо вам за вашу работу! Не могли бы вы записать видео по тайм-менеджменту на экзамене, как лучше распределить время на разные задачи/части, буду очень вам благодарен❤
@leoshastin
@leoshastin 9 ай бұрын
спасибо за фидбек) ближе к экзамену, возможно, запишу подобное видео
@Vadim-yz2bd
@Vadim-yz2bd 9 ай бұрын
спасибо, буду ждать @@leoshastin
@Alam_pang
@Alam_pang 9 ай бұрын
Красавчик, понятно и ясно объяснил!
@positivedegree4029
@positivedegree4029 10 ай бұрын
Спасибо, очень красивое решение и просто для понимания!
@Kattik
@Kattik 10 ай бұрын
Спасибо за такой подробный разбор💗 Очень полезный метод!
@sosechhh
@sosechhh 7 ай бұрын
Здравствуйте! Я от Алексея Кабанова) Спасибо за видео!
@килбос99
@килбос99 6 ай бұрын
Я от Алексея Кабанова. Респект за метод))
@violsil2854
@violsil2854 5 ай бұрын
Еще пара замечаний. 1) На отметке 10:36 вы вводите ограничение (l 700). Т.к. в противном случае очевидно, что разрешенный фрагмент еще не достиг своей предельной длины. Регистрируем истинность логического выражения "(s[r] == 'E') or (k > 700)", корректируем значение (m). При этом длина корректирующего отрезка равна не (r - l + 1), а (r - l), ибо текущий символ, стоящий на позиции (r), запрещен. Код может выглядеть как-то так: s = open('24var04 (1).txt').readline() k = l = m = 0 for r in range(len(s)): k += s[r] == 'A' if (s[r] == 'E') or (k > 700): m = max(m, r - l) if s[r] == 'E': l = r k = 0 while k > 700: k -= s[l] == 'A' l += 1 print(m) Такая программа работает в полтора раза быстрее. Ясное дело, что это мелочь, но если Вы стремитесь сделать код эффективным, зачем делать лишние телодвижения? К слову, еще эффективнее может быть код, который запоминает последние 701 позиций символа 'A' (допустим, в список pointers), и при нахождении 702-го символа вычисляет разность (r - l - 1), т.е. отбрасывает начальную и конечную буквы 'A', определяя максимальную длину допустимого отрезка. С последующей циклической перестановкой указателей: pointers = pointers[1:] + [i]. Такой код тратит время на преобразование списка, но зато не делает второй проход.
@nikkropinoff
@nikkropinoff 10 ай бұрын
большое спасибо! крайне ценный контент
@violsil2854
@violsil2854 5 ай бұрын
Леонид, с Вашего позволения сделаю замечание к временной отметке 25:35 while k>2: if s[l] == 'Y': # убрал один Y из фрагмента k -= 1 l += 1 # сдвигаю левую границу Комментарий к коду логически ошибочен. Если s[l] == 'Y', то мы пока еще НЕ УБРАЛИ символ 'Y' из текущего фрагмента (символ находится на левой границе нашего фрагмента). Символ 'Y' мы убираем из фрагмента только ПОСЛЕ сдвига левого указателя на одну позицию вправо. Если все же хочется написать подобный комментарий в коде, следует переставить операторы местами: while k>2: l += 1 # сдвигаю левую границу if s[l-1] == 'Y': # убрал сдвигом один Y из фрагмента k -= 1 # зафиксировал изменения в счетчике Понятно, что с точки зрения алгоритма это одно и то же, но комментарии к коду должны быть корректными, в противном случае начинающий программист может воспринять суть искаженно, и, впоследствии, сделать ошибку.
@osmanof9209
@osmanof9209 4 ай бұрын
Ваше решение ошибочно
@violsil2854
@violsil2854 4 ай бұрын
@@osmanof9209 Это не решение. Это запись фрагмента кода "другими словами". На суть процесса это вообще никак не влияет.
@polx990
@polx990 8 ай бұрын
Леонид, я ваш фанат
@yuwier
@yuwier 6 ай бұрын
Огромное спасибо за разбор, я от Алексея Михайловича 🙃 Лайк и подписка
@kev1n232
@kev1n232 7 ай бұрын
Всем привет, однозначно лайк, кто тоже с веба Алексея Кабанова
@violsil2854
@violsil2854 5 ай бұрын
По задаче 3: вообще подобные задачи (равно как и №2) удобнее делать с помощью метода split(). Но, понятное дело, речь в данном уроке про другой подход. Касаемо реализации: а зачем такие сложные танцы с бубнами? Имхо, проще сделать следующим образом (но это вкусовщина, разумеется). С помощью метода find() найти индекс первого символа "X". Присвоить обоим указателям этот индекс. Далее, бежать правым указателем до тех пор, пока не насчитаем ровно 500 символов. Зафиксировать текущую длину (выбрать минимальное из текущей длины и ранее записанной в m). Перебросить оба указателя в позиции следующих символов "X" (левый до следующего и правый до следующего). Таким образом, мы снова выделим фрагмент, начинающийся с "X", заканчивающийся в "X", и содержащий ровно 500 символов "X". Фиксируем длину. И т.д. Переброс указателей в следующие позиции можно делать не в цикле, а путем использования find() в срезе строки (начинать срез с позиции, стоящей непосредственно после позиции предыдущего символа "X"). Если в каком-то из допустимых фрагментов встречается "Y", попросту пропускать его и переходить к следующему. Поиск "Y" также можно делать с помощью find() в срезе между позициями левого и правого указателя. Вообще говоря, можно вовсе не использовать два указателя, обходиться лишь одним. Находим c помощью find() первый символ "X". Обрезаем строку S до этого символа (включая сам символ). Бежим до тех пор, пока не насчитаем 499 символов "X". Фиксируем длину (+1, т.к. первый символ обрезали). Обрезаем строку S по текущую позицию. Бежим до тех пор, пока не насчитаем 499 символов "X". Фиксируем длину (+1, т.к. первый символ обрезали). и т.д. Если на пути встретился хотя бы один символ "Y", длину фрагмента не фиксируем (просто переходим к следующему). Все делается только в один проход (а не в 2, как в предложенном методе). Хотя, по сути, это просто вариация "сплита".
@luckytima2315
@luckytima2315 10 ай бұрын
Ну слушай братик это имба так то дикая
@теперьэтоаккаунтигорька
@теперьэтоаккаунтигорька 8 ай бұрын
Классный метод
@froppe5781
@froppe5781 6 ай бұрын
привет, можешь объяснить, как работает while в 3-ей задачке? у нас же внутри вайла при попадании в 'X' будет уменьшаться их счетчик. Сам вайл живой, пока счетчик >= 500, то есть после цикла мы получим счетчик с максимальным значением 499, как он зайдет в проверку условия, если условие от 500?
@leoshastin
@leoshastin 6 ай бұрын
Возьми любой небольшой примерчик (строчку длиной 10-15 символов) и выполни трассировку алгоритма на этой строке. Это лучший способ понять, как это работает, никакие словесные объяснения не дадут более глубокого понимания
@realMiska
@realMiska 8 ай бұрын
Здравствуйте, вот отрывок кода: while a>1 or b>1: a-=s[l]='A' то есть если s[l] не 'А', то тогда уже будет s[l+1] и так далее, пока s[l+n] не станет 'А' (n-натур. число) ? и еще не очень понял почему в count записываем r-l 1:04:50
@leoshastin
@leoshastin 8 ай бұрын
Левый указатель будет сдвигаться до тех пор, пока выражение a > 1 or b > 1 даёт истину, т.е., в данном случае пока значения a, b не станут
@realMiska
@realMiska 8 ай бұрын
@@leoshastin понял, спасибо
@Вергилий-к7р
@Вергилий-к7р 5 ай бұрын
на 19:05 неправильно же. Просто строка так совпала, не гарантировано, что строка, где больше Y по длине больше. Допустим, XYXY - два Y, XXXXXXXXXXY - один Y, но строка длинней.
@leoshastin
@leoshastin 5 ай бұрын
По условию нужно конкретное число Y. В разборе все правильно
@a7kerkh
@a7kerkh 6 ай бұрын
Привет! Можешь сказать сколько примерно зарабатываешь на курсе в месяц? Очень интересно тоже начать преподавать информатику для ЕГЭ и думаю стоит ли оно того
@leoshastin
@leoshastin 6 ай бұрын
привет, однозначно не стоит, если у тебя финансовый вопрос стоит на первом месте
@crushitelyoutuba
@crushitelyoutuba 8 ай бұрын
спасибо братан за этот способ, заменяет сплит, а сплит я просто ненавижу!)
@TankucT_AC
@TankucT_AC 6 ай бұрын
1:16:04 , стоп, если r - l +1 >= 3, то r - l >= 2, нет разве?
@ДмитрийМихеев-у6о
@ДмитрийМихеев-у6о 10 ай бұрын
почему то на платном курсе на степике не могу перейти по ссылке с конспектом для номера 13, хотя раньше получалось. Проверьте, пожалуйста, работает ли у Вас.
@leoshastin
@leoshastin 10 ай бұрын
Всё работает, попробуйте чуть позже ещё раз. Скорее всего какой-то временный технический сбой
@covid0668
@covid0668 10 ай бұрын
а этот алгоритм почти под все задачи может подойти?
@leoshastin
@leoshastin 10 ай бұрын
Многие актуальные задачи влёт решаются с помощью этого алгоритма. Способ нужно выбирать в зависимости от задачи, где-то гораздо легче обычная динамика или разбиение через split
@covid0668
@covid0668 10 ай бұрын
боже зачем составители усложняют 24 задание а 25 оставляют супер простым?
@MAXMAXBETOBSO2
@MAXMAXBETOBSO2 9 ай бұрын
А почему в 5 задаче именно s[r-7:r+1], почему когда пишешь s[r-8:r] ответ другой?
@leoshastin
@leoshastin 9 ай бұрын
Правая граница среза не включается, как и в range
@DopamineDetox-o6k
@DopamineDetox-o6k 10 ай бұрын
А во 2 задаче не будет такого, что левый указатель будет находиться дальше правого?
@leoshastin
@leoshastin 10 ай бұрын
В момент "телепортации" будет, иначе никогда
@andr779
@andr779 10 ай бұрын
Зачем так сложно
@leoshastin
@leoshastin 10 ай бұрын
Если вы знаете, как сделать проще, тогда будьте добры нам продемонстрировать
@АнтонКузьмин-р5ъ
@АнтонКузьмин-р5ъ 9 ай бұрын
вот первую ты подробно разжевал. а третью? вот все ....вот все....Все бы уже так тогда разжевывал!
@leoshastin
@leoshastin 9 ай бұрын
Там нечего разжёвывать, какие-то дополнительные пояснения избыточны, ибо задача минимально отличается от предыдущих
@alexeyich1104
@alexeyich1104 7 ай бұрын
объясните, что я делаю не так(задание РЕШУ ЕГЭ 59729) s = open('24.txt').readline() k=0 l=0 m=999999999 for r in range(1,len(s)): if s[r-1:r+1]=="TT": k+=1 while k>150: if s[l:l+2]=="TT": k-=1 l+=1 if k==150: m=min(m,r-l+1) print(m)
@revlze
@revlze 7 ай бұрын
я бы так написал f = open('24.txt').readline() const = 150 q = [0] * 151 k = 0 m = 10 ** 10 for r in range(1, len(f)): if f[r - 1:r + 1] == 'TT': q += [r - 1] k += 1 if k == const: m = min(r - q[-const] + 1, m) k -= 1 print(m)
@revlze
@revlze 7 ай бұрын
так лол, 3 задание, в данном видео - есть на твой вопрос. ниже немного переделанный код из 3 задания f = open('24.txt').readline() k = l = 0 m = 10**10 const = 150 for r in range(1, len(f)): k += f[r-1:r+1] == 'TT' while k - (f[l:l+2] == 'TT') >= const: k -= f[l:l+2] == 'TT' l += 1 if k == const: m = min(m, r-l+1) print(m)
@revlze
@revlze 7 ай бұрын
но мой код работает быстрее
Задание №22 - Дерево процессов | Информатика ЕГЭ 2024
36:40
Информатика ЕГЭ - Лёня Шастин
Рет қаралды 8 М.
Python VS С# | Согласен / Не согласен
14:27
Технологии в Контуре
Рет қаралды 61 М.
World’s strongest WOMAN vs regular GIRLS
00:56
A4
Рет қаралды 29 МЛН
When u fight over the armrest
00:41
Adam W
Рет қаралды 23 МЛН
СПИДРАН реального варианта ФИПИ за 2761 СЕКУНДУ на 100 баллов
46:01
ИНФОРМАТИКА ЕГЭ 2025 99 БАЛЛОВ
Рет қаралды 11 М.
КУМИР НЕ НУЖЕН, когда есть PYTHON | Алгоритм 6 задания на ЕГЭ 2024
14:40
ИНФОРМАТИКА ЕГЭ 2025 99 БАЛЛОВ
Рет қаралды 43 М.
«Осень». Самая большая загадка Windows XP
14:36
Девять десятых
Рет қаралды 1,1 МЛН
Разбор варианта уровня ЕГЭ #4 - Информатика 2025
2:05:12
Информатика ЕГЭ - Лёня Шастин
Рет қаралды 449