Алгоритмы

2 310 задачвместе с подтемами
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: ✓ успешные, ✗ неуспешные.

На стройплощадку нужно перевезти доски. У бригадира есть грузовик с длинным узким кузовом длиной \(L\) сантиметров — доски укладываются в кузов в один ряд вдоль кузова. На складе лежат \(n\) досок; каждая доска имеет две стороны: толщину \(a_i\) и ширину \(b_i\) сантиметров.

Каждую доску можно положить в кузов двумя способами: плашмя (тогда она занимает вдоль кузова \(a_i\) сантиметров) или на ребро (тогда \(b_i\) сантиметров). Способ укладки выбирается для каждой доски независимо.

Бригадир хочет за один рейс увезти максимальное количество досок. Какие именно — неважно: нужно лишь максимизировать число досок в кузове. Суммарная длина уложенных досок не должна превышать длины кузова.

Определите это максимальное число.

Формат входных данных

В первой строке — два целых числа \(n\) и \(L\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le L \le 10^{14}\)) — количество досок на складе и длина кузова в сантиметрах.

В следующих \(n\) строках — по два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 10^9\)) — размеры сторон \(i\)-й доски в сантиметрах.

Формат выходных данных

Одно целое число — максимальное количество досок, которые можно увезти за один рейс.

Примечание

В первом примере выгодно каждую доску укладывать той стороной, которая короче. Тогда доски займут 2, 4, 3 и 1 см — всего 10 см, помещаются все 4.

Во втором примере даже самая тонкая доска толще кузова, ни одну доску положить нельзя.

Школьник Тимур участвует в серии онлайн-соревнований по программированию. За весь год проходит \(n\) соревнований, и Тимур заранее знает, сколько очков он может набрать в каждом из них: за \(i\)-е соревнование он получит \(s_i\) очков.

По правилам рейтинга, в итоговую сумму идут только \(k\) соревнований по выбору участника (остальные просто не засчитываются). Тимур хочет выбрать такие \(k\) соревнований, чтобы получить максимальную суммарную сумму очков.

Помогите ему вычислить эту максимальную сумму.

Формат входных данных

В первой строке — два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 10^5\)) — общее количество соревнований и сколько из них идут в зачёт.

Во второй строке — \(n\) целых чисел \(s_i\) (\(0 \le s_i \le 10^9\)), разделённых пробелами, — количество очков за каждое соревнование.

Формат выходных данных

Одно целое число — максимальная суммарная сумма очков за \(k\) выбранных соревнований.

Примечание

В первом примере из пяти соревнований с очками \(1, 5, 3, 8, 2\) надо выбрать три. Лучше всего взять соревнования с очками 8, 5 и 3 — в сумме 16.

Во втором примере в зачёт идут все соревнования, так что ответ — сумма всех очков.

Вдоль прямой трассы расположено \(n\) посёлков. У каждого посёлка известна его координата на трассе — целое число \(p_i\). Связисты хотят покрыть все посёлки радиосигналом, установив на трассе несколько радиовышек.

Каждая вышка имеет радиус покрытия 1 километр: она покрывает всё, что находится на расстоянии не более 1 от её координаты. То есть вышка, установленная в точке \(x\), покрывает отрезок \([x - 1; \, x + 1]\). Посёлок считается покрытым, если его координата попадает в покрытие хотя бы одной вышки (граничная точка тоже считается покрытой).

Вышки можно ставить в любых точках прямой, в том числе с нецелыми координатами. Нужно установить минимальное количество вышек, чтобы все посёлки получили сигнал.

Формат входных данных

В первой строке — целое число \(n\) (\(1 \le n \le 10^5\)) — количество посёлков.

Во второй строке — \(n\) целых чисел \(p_i\) (\(-10^9 \le p_i \le 10^9\)), разделённых пробелами, — координаты посёлков. Координаты могут повторяться (несколько посёлков в одной точке).

Формат выходных данных

Одно целое число — минимальное количество радиовышек, необходимое для покрытия всех посёлков.

Примечание

В первом примере посёлки находятся в точках 1, 3, 5. Одна вышка, установленная в точке 2, покроет отрезок \([1; 3]\) и захватит посёлки в точках 1 и 3. Для посёлка в точке 5 нужна ещё одна вышка, например в точке 4 или в точке 5. Итого 2 вышки.

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

Центр управления отправляет на Марс грузовую капсулу. Она может поднять не более \(W\) килограммов полезной нагрузки. Учёные отобрали \(n\) научных приборов, которые хотят отправить в этой миссии; масса каждого прибора равна \(w_i\) килограммов.

Каждый прибор можно либо отправить целиком, либо оставить на Земле — разбирать их на части нельзя. Место в капсуле есть: ограничение только по массе. Цель миссии — отправить максимальное количество разных приборов, чтобы провести как можно больше экспериментов (какие именно приборы полетят — неважно, лишь бы число было максимальным).

Помогите учёным определить, какое максимальное число приборов можно отправить одной капсулой.

Формат входных данных

В первой строке — два целых числа \(n\) и \(W\) (\(1 \le n \le 10^5\), \(1 \le W \le 10^9\)) — количество приборов и грузоподъёмность капсулы в килограммах.

Во второй строке — \(n\) целых чисел \(w_i\) (\(1 \le w_i \le 10^4\)), разделённых пробелами, — масса каждого прибора в килограммах.

Формат выходных данных

Одно целое число — максимальное количество приборов, которые можно отправить на Марс.

Примечание

В первом примере лучше всего отправить приборы массами \(1 + 2 + 3 + 4 = 10\) кг — ровно помещаются в капсулу, итого 4 прибора. Прибор массой 7 кг остаётся на Земле.

Во втором примере каждый прибор по отдельности весит больше грузоподъёмности капсулы. Ни один прибор отправить нельзя.

В актовом зале школы может проходить только одно мероприятие в каждый момент времени. На проведение актового зала подано \(n\) заявок от разных кружков. Каждая заявка — это интервал времени \([l_i; r_i]\): кружок хочет занять зал с минуты \(l_i\) по минуту \(r_i\) включительно.

Два кружка не могут проходить в зале одновременно: если один занимает время \([l_1; r_1]\), а другой — \([l_2; r_2]\), эти интервалы не должны пересекаться. Если один кружок заканчивается ровно в ту минуту, когда начинается другой, это тоже считается пересечением.

Директор хочет одобрить как можно больше заявок. Какое максимальное количество кружков можно разместить в зале за день?

Формат входных данных

В первой строке — целое число \(n\) (\(1 \le n \le 10^5\)) — количество заявок.

В следующих \(n\) строках — по два целых числа \(l_i\) и \(r_i\) (\(0 \le l_i < r_i \le 10^9\)) — время начала и время окончания каждой заявки.

Формат выходных данных

Одно целое число — максимальное количество заявок, которые можно одобрить.

Примечание

В первом примере можно одобрить заявки \([1; 3]\) и \([4; 7]\) — они не пересекаются.

Во втором примере оптимально взять \([2; 3]\) и \([5; 7]\).

Ты копишь на подержанный велосипед и мониторишь Авито. Скопировал тексты объявлений в один файл и хочешь посчитать статистику по ценам.

Цены написаны по-разному: 15 000 ₽, 15000 руб, 15.000 р., от 14000 до 16000 рублей.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк. Цена — число от 1000 до 1 000 000 с возможными разделителями тысяч (пробел или точка), сразу за которым стоит обозначение рубля: ₽, р, р., руб, руб., рубль, рублей, рубля или рубли.

Числа вне диапазона \([1000, 1\,000\,000]\) при статистике игнорируются.

Формат выходных данных

Ровно четыре строки:

min: <минимум>
max: <максимум>
avg: <среднее>
count: <количество>

Среднее — округлить до целого. Если цен не найдено, в первых трёх строках вместо чисел поставить дефис -, а в последней — 0.

Учительница литературы просит помечать тавтологии — когда одно и то же слово стоит подряд два раза: «был был», «очень очень».

Напиши программу, которая в тексте заключает каждую такую пару в квадратные скобки.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк. Слово — это последовательность букв (кириллица или латиница), цифр и подчёркиваний.

Формат выходных данных

Тот же текст, но каждое повторение подряд двух одинаковых слов обёрнуто в квадратные скобки: [слово слово]. Пунктуация и все остальные символы сохраняются.

Примечание

Регистр при сравнении слов не учитывается: Очень очень — тоже повтор. В выводе регистр оригинала сохраняется.

В заметках на телефоне ты ведёшь дневник тренировок. Даты писали по-разному: 17.04.2026, 17/04/2026, 17-04-2026, 17 апреля 2026.

Приведи все найденные даты к ISO-формату YYYY-MM-DD.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк. Формат даты: день (1–2 цифры), разделитель (., /, - или пробел), месяц (2 цифры или слово на русском), разделитель, год (4 цифры).

Формат выходных данных

Каждая найденная дата в формате YYYY-MM-DD на отдельной строке в порядке появления.

Примечание

Поддерживаются названия всех 12 месяцев: январь, февраль, ..., декабрь в любой форме (январь, января, январём — достаточно, чтобы начало совпало с основой).

Ты готовишь скриншот переписки с репетитором для публикации в Instagram-сторис и хочешь замаскировать номера телефонов: оставить префикс (+7 или 8) и последние 2 цифры, а между ними поставить ровно 8 звёздочек.

Например: +7 (903) 123-45-67 превращается в +7********67.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк. Телефоны — российские мобильные в любом из форматов задачи 3.

Формат выходных данных

Тот же текст, но с заменёнными телефонами. Весь остальной текст (пунктуация, пробелы, переносы строк) сохраняется.

Мама выгрузила из электронного дневника текстовую выписку. Каждая строка выглядит так: название предмета, двоеточие, оценки через запятую или пробел.

Напиши программу, которая для каждого предмета посчитает средний балл.

Формат входных данных

Одна или несколько строк вида Название предмета: оценки. Название предмета — одно или несколько русских слов (только буквы и пробелы). Оценки — целые числа от 2 до 5, разделённые запятыми и/или пробелами.

Формат выходных данных

Для каждого предмета в том же порядке, в котором они встретились во входе, выведи строку вида Предмет: X.XX — название, двоеточие, пробел, средний балл с двумя знаками после точки.

Примечание

Используй округление Python по умолчанию (функция round). Предметы без оценок (если такие попадутся) в выводе пропускай.

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

Никнейм — это символ @, за которым идут от 5 до 32 символов: латинские буквы, цифры и подчёркивания. Короткие последовательности (меньше 5 символов) никнеймами не считаются.

Формат входных данных

В первой строке — число \(N\) (\(1 \le N \le 100\)) — сколько самых упоминаемых никнеймов нужно вывести.
Далее — произвольный текст чата до 10 000 символов.

Формат выходных данных

Топ-\(N\) никнеймов в нижнем регистре, каждый на отдельной строке. Порядок — по убыванию частоты упоминаний; при равенстве частот раньше идёт тот, кто первым встретился в тексте.

Если уникальных никнеймов меньше \(N\), выведи все, что есть.

Примечание

Регистр при подсчёте игнорируется: @Katya и @katya — один человек.

Классный руководитель попросил собрать все email-адреса из чата родителей в один список: без дубликатов, в едином регистре и в алфавитном порядке.

Формат входных данных

Произвольный текст до 10 000 символов, возможно в несколько строк.

Формат выходных данных

Каждый уникальный email-адрес на отдельной строке в нижнем регистре, отсортированный лексикографически.

Примечание

Упрощённый формат email: имя@домен.зона, где имя — буквы, цифры, точки, дефисы, подчёркивания; домен — буквы, цифры, дефисы (без точек); зона — 2–6 латинских букв.

Ты ведёшь паблик класса во ВКонтакте и хочешь собирать статистику по хештегам.

Напиши программу, которая читает текст поста и выводит все хештеги в порядке появления.

Хештег — это символ #, за которым идут один или более символов: буквы (латиница или кириллица), цифры или подчёркивания.

Формат входных данных

Произвольный текст от одной до 100 строк, общей длиной не более 10 000 символов.

Формат выходных данных

Каждый найденный хештег на отдельной строке в порядке появления в исходном тексте.

🎓
Шаг 8: GPA для Германии?!
Сложно
Вася решил подстраховаться и подать документы ещё в TU München. Анкета на немецком, всё страшно, но главное — они просят оценки в шкале 0–100. У Васи: в аттестате 5/5, в Coursera-сертификатах 87%, в одной программе обмена GPA: 3.85. Помоги ему всё конвертировать.
Условие задачи
 

Приведи все оценки к шкале 0–100:

  • Проценты (87%) — число до знака % без изменений.
  • Российская 5-балльная (4/5) — \(\text{балл}/5 \times 100\) (целая часть).
  • GPA (GPA: 3.6) — \(\text{GPA}/4{,}0 \times 100\), округлить функцией round() Python.
Входные данные

Одна строка с оценками, разделёнными запятой и пробелом. Префикса перед оценками нет.

Выходные данные

Целые числа от 0 до 100, по одному на строке.

Подсказка: Раздели строку по ", " и для каждой части примени поочерёдно три регулярных выражения: (\d+)%, (\d)/5, GPA:\s*(\d\.\d+).
🏆
Шаг 2: Регистрация на олимпиаду
Просто
Вася регистрируется сразу на пять олимпиад: «Высшая проба», «Ломоносов», «Турнир городов»… У него три почты: рабочая, школьная и одна старая, которую он завёл в 5 классе ради игры. Плюс ещё мамина — на неё приходят уведомления, потому что мама так захотела. Вася записал все свои email в один файл, но потом перепутал, какие из них рабочие. Помоги вытащить все валидные.
Условие задачи
 

Email состоит из:

  • имени из латинских букв, цифр и точек,
  • символа @,
  • домена из латинских букв, цифр и точек,
  • точки и доменной зоны из 2–4 латинских букв.
Входные данные

Одна строка произвольного текста.

Выходные данные

Все найденные email-адреса, по одному на строке.

Подсказка: [a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}. Точку перед зоной нужно экранировать: \..
🎓
Шаг 8: Три шкалы — одна голова
Сложно
Маша снова на связи! Теперь она прислала свои оценки. Из российской школы — 5/5, из онлайн-курса Coursera — 87%, а из американской летней программы — GPA: 3.85. Приёмная комиссия Гарварда смотрит на это как на «криптозагадку из эпохи майя». Помоги Маше: приведи всё к шкале 0–100, чтобы хоть кто-то понял её средний уровень.
Условие задачи
 

Приведи все оценки к единой шкале 0–100:

  • Проценты (87%) — число до знака % без изменений.
  • Российская 5-балльная (4/5) — \(\text{балл}/5 \times 100\) (целая часть).
  • GPA (GPA: 3.6) — \(\text{GPA}/4{,}0 \times 100\), округлить функцией round() Python.
Входные данные

Одна строка с оценками, разделёнными запятой и пробелом. Префикса перед оценками нет.

Выходные данные

Целые числа от 0 до 100, по одному на строке, в порядке появления.

Подсказка: Раздели строку по ", ", для каждой части примени поочерёдно три регулярных выражения: (\d+)%, (\d)/5, GPA:\s*(\d\.\d+).
🌐
Шаг 7: Карта мира университетов
Средне
Подруга Алисы — Маша — решила поступать и в Россию, и за границу одновременно. Она прислала тебе текстовый файл с десятками ссылок: МГУ, ВШЭ, MIT, Oxford, ETH Zurich… В таком объёме легко запутаться. Маша просит сделать чистый список доменов, «без всяких этих https и www, чтобы влезло на одну страницу». Маша знает, чего хочет.
Условие задачи
 

Извлеки только доменное имя без префикса www. и без пути.

Формат URL: http:// или https://, затем опционально www., затем доменное имя (буквы, цифры, точки), затем опционально / и путь.

Входные данные

Одна строка текста с URL-ами.

Выходные данные

Доменные имена без www., по одному на строке, в порядке появления.

Подсказка: Группа захвата: https?://(?:www\.)?([a-zA-Z0-9.]+?)(?=[/\s]|$). (?:...) — группа без захвата, (?=...) — lookahead.
📧
Шаг 2: Письма из ниоткуда
Просто
День второй. На почту приёмной комиссии завалилось 347 писем от абитуриентов. Кто-то пишет email в подписи, кто-то в теле письма, кто-то прямо в теме: «Если что, пишите на vasya.gamer@hse.ru, я там всегда онлайн». Твой начальник просит собрать все email в один список, потому что Excel у него снова завис. Печаль.
Условие задачи
 

Email считается валидным, если он состоит из:

  • имени из латинских букв, цифр и точек,
  • символа @,
  • домена из латинских букв, цифр и точек,
  • точки и доменного зона из 2–4 латинских букв (например, .ru, .edu, .com).
Входные данные

Одна строка произвольного текста.

Выходные данные

Все найденные email-адреса, по одному на строке, в порядке появления.

Подсказка: Шаблон: [a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}. Не забудь экранировать точку перед доменной зоной: \..
📋
Шаг 1: Хаос в приёмной комиссии
Просто
Привет, абитуриент! Сейчас сентябрь, ты только что устроился стажёром в приёмную комиссию МГУ. В первый же день тебе вручают флешку с базой студентов и говорят: «Разберись». Открываешь файл — а там полный бардак: ID студентов, шутки в чате, чьи-то заметки и даже рецепт борща. Надо извлечь только настоящие ID.
Условие задачи
 

Каждый ID студента имеет строгий формат: ровно две заглавные латинские буквы и ровно четыре цифры подряд. Например, AB1234, MK0001, PR2024.

Дана одна строка текста (до 10 000 символов). Извлеки из неё все валидные ID и выведи их по одному на строке в порядке появления.

Входные данные

Одна строка произвольного текста.

Выходные данные

Все найденные ID, по одному на строке. Если ID не найдены — пустой вывод.

Дан неориентированный планарный граф на \(n\) вершинах и целое положительное число \(k\). Назовем раскраску графа красивой, если никакие две соседние его вершины не покрашены в один цвет (для лучшего понимания рекомендуем обратиться к разделу "Примечание"). Найдите количество красивых раскрасок графа в \(k\) цветов.

В первой строке ввода находится единственное целое число \(t\) — количество тестовых случаев, которые вам будет необходимо обработать \((1 \leq t \leq 100)\).

Первая строка каждого тестового случая содержит целые числа \(n\), \(m\) и \(k\) — количество вершин и рёбер графа, а также количество доступных цветов \((1 \leq n \leq 30, 1 \leq m \leq 40, 1 \leq k \leq 11)\). Обратите внимание, что с ростом \(n\) значение \(k\) в тестах убывает.

Следующие \(m\) строк содержат по два целых числа \(u, v\), задающих рёбра графа.

Для каждого тестового случая выведите единственное число — количество красивых раскрасок графа по модулю \(10^9+7\).

Планарный граф — граф, который можно изобразить на плоскости без пересечений рёбер не по вершинам.

В тесте из условия задан следующий граф:

image

Поделиться
Класснуть