6 алгоритмов решения задач по спортивному программированию


Оглавление (нажмите, чтобы открыть):

Как ускорить решение задач по программированию

Я сегодня сел решать задачу для начинающих (решил её на Java, но это неважно, я всё равно не использовал никаких библиотек, что C++, что Java в моём случае разницы почти не видно — написал сюда, потому что здесь больше людей). Потратил на неё 4 часа. Писал код с 10 до 2 часов, причём задача элементарная. Сначала думал, потом написал код — код не работал. Исправлял миллион ошибок. Там ошибка, здесь ошибка.

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

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

Просто 4 часа на такой детский сад — это слишком-слишком много. Меня беспокоит, что я думаю слишком медленно.

Пилообразная последовательность
(Время: 1 сек. Память: 16 Мб Сложность: 38%)

Последовательность a1, a2, a3, … , an-1, an называется пилообразной, если она удовлетворяет одному из следующих условий:

Дана числовая последовательность. Требуется определить длину самой длинной ее пилообразной непрерывной подпоследовательности.
Входные данные

В первой строке входного файла INPUT.TXT записано натуральное число N – количество элементов последовательности. Во второй строке файла через пробел записаны N элементов целочисленной последовательности . Ограничения: N 0

19.01.2020, 14:11

Где можно скачать книги с примерами решениями задач задач по программированию
подскажите где можно скачать книги с примерами решениями задач задач по программированию (что бы.

Сборник задач по программированию
Можете скинуть методичку с задачами с четкой формулировкой для обучения кодинга на яве, уровень от.

Решения задач по программированию
Сюда кидаем простые задачи по паскалю. Для университета или школы. 1)Определить, является ли.

Сборник задач по программированию
Может не туда пишу, вы меня извените но очень надо. Кто может скинуть книгу — Сборник задач по.

Сборник задач по программированию на СИ
Здравствуйте! Хочу узнать, есть ли сборник задач по программированию на языке СИ? Видел такие.

19.01.2020, 14:22 2

Сразу вспоминается момент из фильма «Пароль рыба-меч» со взломом Пентагона

Тема бредовая. Все мы индивидуальны. Кто-то и за 4 часа задачу не решит.
Но у вас, я так полагаю, просто не хватает практики, рука не набита.
Изучая язык, вы со временем будете лучше знать конструкции языка, «синтаксический сахар». Усвоите контейнеры, стандартные алгоритмы, их асимптотическую сложность для основных операций. И уйдут ошибки, связанные с синтаксисом языка, а работа программы ускорится от выбора правильного инструмента.

Однако, для задачек по спортивному программированию, знание самого языка вторично. Как вы сами выразились,

19.01.2020, 15:08

мне кажется лучший способ быстро думать

Меню пользователя @ obivan
19.01.2020, 15:54 4 21.01.2020, 10:20 [ТС] 5

Я также придумал следующие вещи для повышения скорости решения задач: завёл для себя файл в Экселе. В нём у меня следующие колонки:

1. Номер задачи
2. Сложность задачи
3. Процент решаемости задачи другими людьми
4. Время, потраченное на решение задачи
5. Начало решения задачи: час и минута
6. Конец решения задачи: час и минута
7. Язык, на котором решил задачу

Цель — смотреть на эти записи иногда и убеждаться в том, что со временем твоя скорость растёт. Скажем, неделю назад или месяц назад ты решил задачу со сложностью в 40 процентов за 4 часа, а сейчас — за 3 часа.

Сегодня в первый раз попробовал новую для себя методику: стал намного собранней. Раньше еле-еле сидишь, голова витает в облаках. Здесь один сайт откроешь, тут второй сайт, прочитаешь новость о чём-то ненужном. А так сконцентрировался и пошёл как можно быстрее писать код: решил сегодня задачу, очень-очень простую задачу, за 9 минут (без этой системы я бы решил её намного дольше).

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

Добавлено через 18 минут
И ещё в чём тут заключается фишка: ты соревнуешься сам с собой.

Когда ты просто решаешь задачу, то соревнуешься с машиной: смог ты преодолеть или нет. А здесь ты ещё и соревнуешься сам с собой.

Ты соревнуешься со старой версией себя и стараешься решать задачи так, чтобы новая версия была лучше старой. И это добавляет интереса к подобной игре.

6 алгоритмов решения задач по спортивному программированию

Исключительно важно использовать язык блок-схем при разработке алгоритма решения задачи. Решение одной и той же задачи может быть реализовано с помощью различных алгоритмов, отличающихся друг от друга как по времени счета и объему вычислений, так и по своей сложности. Запись этих алгоритмов с помощью блок-схем позволяет сравнивать их, выбирать наилучший алгоритм, упрощать, находить и устранять ошибки.

Отказ от языка блок-схем при разработке алгоритма и разработка алгоритма сразу на языке программирования приводит к значительным потерям времени, к выбору неоптимального алгоритма. Поэтому необходимо изначально разработать алгоритм решения задачи на языке блок-схем, после чего алгоритм перевести на язык программирования.

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

В процессе разработки алгоритма решения задачи можно выделить следующие этапы:

  • Этап 1 . Математическое описание решения задачи.
  • Этап 2 . Определение входных и выходных данных.
  • Этап 3 . Разработка алгоритма решения задачи.

Базовые алгоритмические конструкции

В теории программирования доказано, что для записи любого, сколь угодно сложного алгоритма достаточно трех базовых структур:

  • следование (линейный алгоритм);
  • ветвление (разветвляющийся алгоритм);
  • цикл-пока (циклический алгоритм).

Линейные алгоритмы


Линейный алгоритм образуется из последовательности действий, следующих одно за другим. Например, для определения площади прямоугольника необходимо сначала задать длину первой стороны, затем задать длину второй стороны, а уже затем по формуле вычислить его площадь.

Пример

ЗАДАЧА. Разработать алгоритм вычисления гипотенузы прямоугольного треугольника по известным значениям длин его катетов a и b.

На примере данной задачи рассмотрим все три этапа разработки алгоритма решения задачи:

Этап 1. Математическое описание решения задачи.

Математическим решением задачи является известная формула:

где с-длина гипотенузы, a, b – длины катетов.

Этап 2. Определение входных и выходных данных.

Входными данными являются значения катетов a и b. Выходными данными является длина гипотенузы – c.

Этап 3. Разработка алгоритма решения задачи.

На данной схеме цифрами указаны номера элементов алгоритма, которые соответствуют номерам пунктов словесного описания алгоритма.

Разветвляющиеся алгоритмы

Алгоритм ветвления содержит условие, в зависимости от которого выполняется та или иная последовательность действий.

Пример

ЗАДАЧА. Разработать алгоритм вычисления наибольшего числа из двух чисел x и y.

Этап 1. Математическое описание решения задачи.

Из курса математики известно, если x > y, то наибольшее число x, если x y, то переход к шагу 6, иначе к шагу 7.

  • Вывод информации: число x больше y. Переход к шагу 8.
  • Вывод информации: число y больше x. Переход к шагу 8.
  • Конец алгоритма.
  • В схеме алгоритма решения задачи цифрами указаны номера элементов алгоритма, которые соответствуют номерам шагов словесного описания алгоритма

    В рассматриваемом алгоритме (рис.3) имеются три ветви решения задачи:

    • первая: это элементы 1, 2, 3, 4, 8.
    • вторая: это элементы 1, 2, 3, 5, 6, 8
    • третья: это элементы 1, 2, 3, 5, 7, 8.

    Выбор ветви определяется значениями x и y в элементах 3 и 5, которые являются условиями, определяющими порядок выполнения элементов алгоритма. Если условие (равенство), записанное внутри символа «решение», выполняется при введенных значениях x и y, то следующими выполняется элементы 4 и 8. Это следует из того, что они соединены линией с надписью «да» и направление (последовательность) вычислений обозначена стрелочкой.

    Если условие в элементе 3 не выполняется, то следующим выполняется элемент 5. Он соединен с элементом 3 линией с надписью «нет». Если условие, записанное в элементе 5, выполняется, то выполняется элементы 6 и 8, в противном случае выполняются элементы 7 и 8.

    Циклические алгоритмы

    Циклический алгоритм определяет повторение некоторой части действий (операций), пока не будет нарушено условие, выполнение которого проверяется в начале цикла. Совокупность операций, выполняемых многократно, называется телом цикла.

    Алгоритмы, отдельные действия в которых многократно повторяются, называются циклическими алгоритмами, Совокупность действий, связанную с повторениями, называют циклом.

    При разработке алгоритма циклической структуры выделяют следующие понятия:

    • параметр цикла – величина, с изменением значения которой связано многократное выполнение цикла;
    • начальное и конечное значения параметров цикла;
    • шаг цикла – значение, на которое изменяется параметр цикла при каждом повторении.

    Цикл организован по определенным правилам. Циклический алгоритм состоит из подготовки цикла, тела цикла и условия продолжения цикла.

    В подготовку цикла входят действия, связанные с заданием исходных значений для параметров цикла:

    • начальные значения цикла;
    • конечные значения цикла;
    • шаг цикла.

    В тело цикла входят:

    • многократно повторяющиеся действия для вычисления искомых величин;
    • подготовка следующего значения параметра цикла;
    • подготовка других значений, необходимых для повторного выполнения действий в теле цикла.


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

    Пример

    ЗАДАЧА. Разработать алгоритм вычисления суммы натуральных чисел от 1 до 100.

    Этап 1. Математическое описание решения задачи.

    Обозначим сумму натуральных чисел через S. Тогда формула вычисления суммы натуральных чисел от 1 до 100 может быть записана так:

    где Xi – натуральное число X c номером i, который изменяется от 1 до n, n=100 – количество натуральных чисел.

    Этап 2. Определение входных и выходных данных.

    Входными данными являются натуральные числа: 1, 2, 3, 4, 5, …, 98, 99, 100.

    Выходные данные – значение суммы членов последовательности натуральных чисел.

    Параметр цикла величина, определяющая количество повторений цикла. В нашем случае i – номер натурального числа.

    Подготовка цикла заключается в задании начального и конечного значений параметра цикла.

    • начальное значение параметра цикла равно 1,
    • конечное значение параметра цикла равно n,
    • шаг цикла равен 1.

    Для корректного суммирования необходимо предварительно задать начальное значение суммы, равное 0.

    Тело цикла. В теле цикла будет выполняться накопление значения суммы чисел, а также вычисляться следующее значение параметра цикла по формулам:

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

    Этап 3. Разработка алгоритма решения задачи.

    Введем обозначения: S – сумма последовательности, i – значение натурального числа.

    Начальное значение цикла i=1, конечное значение цикла i =100, шаг цикла 1.

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

    6 алгоритмов решения задач по спортивному программированию

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

    Комментарии (3)

    Владимир Ваганов

    это прикол такой примеры на разных языках в статьях писать?��

    Александр Богачев

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

    Евгений Набоков

    Alexander, 90% контента proglib.

    О проекте

    Данный сайт является агрегатором контента из популярных социальных сетей. Добавление новых материалов производится в автоматическом режиме. Администрация проекта не несет ответственности за их содержание.

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

    6 алгоритмов решения задач по спортивному программированию

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

    Комментарии (3)

    Владимир Ваганов

    это прикол такой примеры на разных языках в статьях писать?��

    Александр Богачев

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

    Евгений Набоков

    Alexander, 90% контента proglib.

    О проекте

    Данный сайт является агрегатором контента из популярных социальных сетей. Добавление новых материалов производится в автоматическом режиме. Администрация проекта не несет ответственности за их содержание.

    6 алгоритмов решения задач по спортивному программированию


    Открытая олимпиада ФМИ по программированию
    суббота, 18 октября 2014 г., 11-00 — 15-00
    участие по интернету из дома

    Если Вы еще не регистрировались в системе ejudge, то для участия в олимпиаде необходимо
    СОЗДАТЬ УЧЕТНУЮ ЗАПИСЬ Если у ваc уже есть учетная запись в системе, для участия в олимпиаде нужно ИСПОЛЬЗОВАТЬ СУЩЕСТВУЮЩУЮ УЧЕТНУЮ ЗАПИСЬ

    Кружок по программированию для школьников
    вторник, пятница с 15 до 18-00.

    Словесное описание алгоритма Запись алгоритма на языке блок-схем
    1. Начало алгоритма.
    2. Ввод значений длин катетов a и b.
    3. Вычисление длины гипотенузы с по формуле
    4. Вывод значения длины гипотенузы.
    5. Конец алгоритма
    I семестр
    Программирование
    Линейные алгоритмы

    до 29 сентября Результаты
    Проверка на списывание (10.11.2020 23:00:07)
    A. Сумма, разность, произведение и частное
    B. Средние значения
    C. Площадь кольца
    D. Площадь треугольника
    E. Квадратное уравнение
    F. Гипотенуза G. Сумма цифр числа
    2020 2020
    Условный оператор до 6 октября Результаты
    Проверка на списывание (10.11.2020 23:00:12)
    A. Степени
    B. Наименьшее из трех чисел
    C. Три упорядоченных значения
    D. Проверка упорядоченности
    E. Точка на координатной плоскости
    F. Расстояния между точками
    G. Квадратное уравнение
    2020 2020
    Оператор цикла до 13 октября Результаты
    Проверка на списывание (10.11.2020 23:00:15)
    A. Делимость на сумму цифр
    B. Наибольший общий делитель
    C. Числа по модулю M
    D. Формула Герона извлечения квадратного корня
    E. Схема Горнера
    F. Числа трибоначчи
    G. Число e в степени x
    2020 2020
    Одномерные массивы — I до 20 октября Результаты
    Проверка на списывание (10.11.2020 23:00:19)
    A. В обратном порядке
    B. Четные и нечетные индексы
    C. Четные и нечетные элементы
    D. Циклический сдвиг на одну позицию
    E. Арифметическая прогрессия
    F. Близкие по величине элементы
    G. Перестановка между минимальным и максимальным
    2020 2020
    Одномерные массивы — II до 27 октября Результаты
    Проверка на списывание (10.11.2020 23:00:22)
    A. Максимальное количество одинаковых элементов
    B. Перестановка или нет
    C. Длина самой длинной последовательности подряд идущих элементов
    D. Слияние массивов
    E. Сортировка выбором
    F. Сортировка обменом
    G. Индексы отсортированных элементов
    2020 2020
    Строки до 3 ноября Результаты
    Проверка на списывание (10.11.2020 23:00:24)
    A. Получение палиндрома
    B. Количество слов в тексте
    C. Числа, заданные строками
    D. Поиск подстроки в строке
    E. Сравнение двух строк
    F. Лексикографическая сортировка
    G. Поиск анаграмм
    2020 2020
    Двумерные массивы — I до 10 ноября Результаты
    Проверка на списывание (10.11.2020 23:00:28)
    A. Матрица количества вхождений
    B. Максимальное значение в каждой строке
    C. Столбец с максимальной суммой
    D. Седловая точка в матрице
    E. Обмен столбцов с минимальным и максимальным значением
    F. Перестановка столбцов по возрастанию последней строки
    G. Минимальный среди максимальных элементов строк
    2020 2020
    Двумерные массивы — II до 17 ноября Результаты
    Проверка на списывание (10.11.2020 23:00:29)
    A. Заполнение вправо-вверх
    B. Заполнение влево-вверх
    C. Заполнение по спирали
    D. Театр
    E. Граница
    F. Поворот
    G. Уголок
    2020 2020
    Функции — I до 24 ноября Результаты
    Проверка на списывание (10.11.2020 23:00:29)
    A. Математические функции
    B. Наименьшее и наибольшее из четырех чисел
    C. Циклический сдвиг массива
    D. Шифрование XOR
    E. Сиcтема двух линейных уравнений с двумя неизвестными
    F. Быстрое возведение в степень по модулю
    G. Функция с факториалами
    2020 2020
    Функции — II до 1 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:30)
    A. Проверка на простоту
    B. Функция Эйлера
    C. Число сочетаний из N по М
    D. Чтение длинного числа
    E. Длинное сложение
    F. Следующая престановка
    G. Следующий наименьший палиндром
    2020 2020
    Рекурсивные алгоритмы до 15 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:30)
    A. Вывод чисел по порядку
    B. Фрактал
    C. Биномиальные коэффициенты — рекурсия с запоминанием
    D. Канторово множество
    E. Строки Фибоначчи
    F. Рекурсивная сумма цифр
    G. Расстановка ферзей
    2020 2020
    Разные задачи до 22 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:33)
    2020 2020 2020
    Результаты за семестр 2020 2020
    Архитектура ЭВМ
    Тест 1. Введение в архитектуру до 27 декабря Результаты Темы:
    1. Основнче понятия.
    2. Назанчение и размер регистров.
    Тест 2. Представление данных до 27 декабря Результаты Темы:
    1. Диапазоны значений данных разного размера.
    2. Перевод из десятичной и в десятичную систему.
    3. Дополнительный код.
    4. Представление чисел с плавающей точкой.
    5. ASCII-коды.
    Тест 3. Синтаксис языка ассемблер x86_64 AT&T до 27 декабря Результаты Темы:
    1. Префиксы операндов.
    2. Названия регистров.
    3. Размеры операндов.
    4. Директивы.
    Задачи по программированию на языке ассемблера

    до 22 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:33)
    Результаты за семестр
    II семестр
    Геометрия до 31 мая Результаты
    Проверка на списывание (10.11.2020 23:00:37)
    A. Клетки внутри окружности
    B. Полярный угол точки
    C. Площадь многоугольника
    D. Оси симетрии четырёхугольника
    E. Точка пересечения прямых
    F. Выпуклый многоугольник
    G. Точка и выпуклый многоугольник
    H. Расстояние от точки до отрезка
    2020 2020
    Стеки, очереди, списки до 31 мая Результаты
    Проверка на списывание (10.11.2020 23:00:40)
    A. Количество скобок
    B. Баланс скобок
    C. (p, q) — лошадь
    D. Арифметическое выражение
    E. Монобильярд
    F. Книжная полка и динамические списки
    2020 2020
    Деревья отрезков. Sqrt-декомпозиция до 31 мая Результаты
    Проверка на списывание (10.11.2020 23:00:41)
    A. Простая сумма (дерево отрезков — сумматор)
    B. Скобки (дерево отрезков — сумматор, минимизатор) C. Пуаро и сумма сумм (дерево отрезков — сумматор)
    D. Денис и команды (обновление на отрезке)
    E. Максимальная площадь треугольника (дерево отрезков с хранением подмасивов в узлах)
    2020 2020
    Поиск подстроки в строке до 31 мая Результаты
    Проверка на списывание (10.11.2020 23:00:42)
    A. Лексикографически наибольшее вращение
    B. Поиск пароля (чаще всего встречающаяся подстрока)
    C. Две строки (поиск подстроки в строке)
    D. Поиск подстроки во входном потоке
    2020 2020
    Разные задачи до 31 мая Результаты
    Проверка на списывание (10.11.2020 23:00:54)
    2020 2020
    Результаты за семестр 2020 2020

    ВНИМАНИЕ! Задачи принимаются до 2 июня 2020 г.

    III семестр
    Графы. Элементраные алгоритмы до 28 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:55)
    A. Поиск узла в списке смежности B. Обход в глубину. Степень узла
    C. Количество путей. Возведение матрицы смежности в степень
    D. Топологическая сортировка
    E. Подъём по дереву от узла к корню
    2020
    Графы. Поиск кратчайших путей до 28 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:56)
    A. Алгоритм Дейкстры B. Алгоритм Форда-Беллмана
    C. Алгоритм Флойда
    D. Алгоритм Дейкстры. Динамика на графе
    E. Задача коммивояжера. Динамика на битовых масках
    F. Диаметр дерева
    2020
    Графы. Мосты. Точки сочленения. Потоки до 28 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:56)
    A. Поиск мостов
    B. Точки сочленения
    C. Максимальный поток
    D. Максимальное паросочетание. Двоичный поиск по ответу.
    E. Наименьший общий предок (LCA)
    F. Минимальный каркас
    2020
    Разные задачи до 28 декабря Результаты
    Проверка на списывание (10.11.2020 23:00:59)
    2020 2020 2020
    Результаты за семестр 2020

    (25.01.2020 11:10:30)
    Оценки (17.06.2020)

    IV семестр
    Задачи по системному программированию
    (регистрация модерируемая)
    до 31 мая Результаты
    Проверка на списывание (10.11.2020 23:01:28)
    Системное программное обеспечение. Учебник
    Шаблон для оформления задачи на практику 2 курс
    Пример оформления отчёта — 1
    Пример оформления отчёта — 2
    2020 2020
    Системное программное обеспечение. Учебник 2020

    ВНИМАНИЕ! Задачи принимаются до 2 июня 2020 г.

    Задачи по программированию. Где размять руки?

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

    В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

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

    Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

    Coding Bat

    Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

    Code Abbey

    Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

    Top Coder

    Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы «засветиться». Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

    Programmr

    На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.

    Кроме того, на данном ресурсе вы можете создать свой проект и поделиться им с миром – количество просмотров некоторых из таковых переваливает за 100 000.

    Programming Skills

    Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

    SQL-EX.RU

    Наконец, для изучающих SQL идеально подойдет данный портал. Он предлагает огромное количество задач, охватывающих все типажи запросов. Для мотивации же пользователей введена рейтинговая система всех зарегистрировавшихся посетителей – за каждый верный ответ вы получите определенное число очков. Количество оных зависит от сложности задачи, в чем, к слову, кроется и еще один плюс ресурса. Ведь он подойдет как начинающим (или тем, кому достаточно базовых знаний), так и тем, чья служба невозможна без конструирования сложных запросов.

    Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.
    Автор: Александр Мороз

    Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по Основам программирования.

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

    В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

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

    Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

    Coding Bat

    Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

    Code Abbey

    Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

    Top Coder

    Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы «засветиться». Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

    Programmr

    На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.


    Кроме того, на данном ресурсе вы можете создать свой проект и поделиться им с миром – количество просмотров некоторых из таковых переваливает за 100 000.

    Programming Skills

    Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

    SQL-EX.RU

    Наконец, для изучающих SQL идеально подойдет данный портал. Он предлагает огромное количество задач, охватывающих все типажи запросов. Для мотивации же пользователей введена рейтинговая система всех зарегистрировавшихся посетителей – за каждый верный ответ вы получите определенное число очков. Количество оных зависит от сложности задачи, в чем, к слову, кроется и еще один плюс ресурса. Ведь он подойдет как начинающим (или тем, кому достаточно базовых знаний), так и тем, чья служба невозможна без конструирования сложных запросов.

    Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.
    Автор: Александр Мороз

    Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по Основам программирования.

    6 алгоритмов решения задач по спортивному программированию

    « Алгоритмы. Олимпиадное программирование для школьников «

    Продолжительность курса: 2 года.

    По сути, это «соль» программирования, задачи сортировки, поиска, обхода «дерева», «рюкзак», «коммивояжер» и т.п.

    Курс рассчитан на 2-х летний цикл обучения.

    Каждый модуль курса рассчитан на полугодие, 12 занятий по два урока в неделю (1,5 астрономических часа).

    Курс рекомендован учащимся 9–10-х классов, которые обладают базовыми знаниями по программированию в объеме любого из курсов: «Основы программирования на Java» или «Основы программирования в 1С:Предприятие 8»

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

    — Познакомитесь с тестирующей системой Ejudge, в которой проходят все крупнейшие соревнования по спортивному программированию.

    — Сможете на лету решать основные задачи из области арифметики: разложение числа на цифры, на простые множители, делимость, арифметика остатков.

    — Освоите классические алгоритмы и хитрые трюки для решения задач на обработку последовательностей.

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

    — Изучите различные методы сортировки, в том числе использующие тонкие оптимизации.

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

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

    Пётр Митричев — Легенда спортивного программирования

    Содержание статьи

    Говорят, когда он появился на свет, к нему заглянул сам Дональд Кнут. Говорят, когда его пригласили работать в Google, он за 15 минут переписал весь поисковый алгоритм 16 раз. Говорят, он с улыбкой следит за прогрессом квантовых вычислений, так как при виде его числа от страха факторизуются сами. Но мы точно знаем одно: Пётр — настоящий бог спортивного программирования.

    Факты

    • Призер многочисленных чемпионатов, Пётр дважды побеждал в TopCoder и дважды занимал второе место в ACM ICPC.
    • В свободное время Пётр ведет блог о регулярных контестах «Алгоритмические задачи для чайников»: petr-mitrichev.blogspot.ru.
    • Сейчас Митричев работает в Google, где занимается качеством поиска. Также Пётр помогает в подготовке соревнований Google Code Jam.

    Многие считают, что спортивные программисты — это крутые ребята, настоящие гики, разбирающиеся в алгоритмах и решающие сложные задачи. Но также говорят, что им очень сложно потом где-то себя применить. Это так?

    Спортивное программирование и вообще то, чем мы занимаемся на олимпиадах, — это действительно не та вещь, которой можно зарабатывать на жизнь. С другой стороны, программирование, как и любой другой спорт, — это развитие для человека. Благодаря ему человек становится умнее, лучше программирует, лучше ищет в программах ошибки. После такой подготовки легче работать и заниматься другими интересными вещами.

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

    На каком языке ты писал решения для задач?

    На Java. В школе я писал на Pascal, потому что больше тогда ничего не знал. А потом, когда нужно было выбрать, на что перейти, Java оказался ближе к Pascal.

    В условиях соревнования нужно написать программу за 20–30 минут, и она должна сразу работать правильно. Поэтому очень важно, чтобы язык не позволял сажать баги. C++, который использует большинство, отличается тем, что на нем довольно легко написать неправильную программу. Можно случайно забыть что-то, присвоить неправильный тип переменной, но все это будет как-то компилироваться и как-то работать. Скорее всего, не так, как ты ожидаешь.

    В Java, если допустить ошибку или опечатку, программа, скорее всего, просто не скомпилируется. Здесь все строже, как и в случае с Pascal. Мне это показалось более подходящим. Обратная сторона медали — программы на Java часто работают раза в полтора медленнее, чем программы на C++. Иногда именно этих полутора раз не хватает, чтобы программа укладывалась в условие задачи.

    Язык программирования каждый может выбирать сам, да?

    Есть ограничения. Конечно, бывают разные соревнования. возьмем Google Code Jam, к примеру. Когда мы решали, как лучше его сделать, мы придумали, что можно работать на любом языке. Ты скачиваешь на компьютер входной файл с данными задачи, запускаешь на компьютере свою программу, а потом посылаешь на сервер результат. Какой у тебя на компьютере стоит компилятор/интерпретатор, тем и можно пользоваться. Минус данной системы в том, что компьютеры у людей разные. У кого-то компьютер в десять раз мощнее, чем у другого. Поэтому приходится создавать задачи, где неправильное решение от правильного по скорости отличается хотя бы в сто раз. Чтобы если у человека компьютер в десять раз медленнее, правильное решение у него работало, или на компьютере в десять раз быстрее неправильное решение все равно не работало. Поэтому нужны задачи с большим зазором между правильным и неправильным решением по скорости работы.

    На Topcoder, Codeforces и ACM используется стандартная система, где ты посылаешь исходный код и они запускают его у себя на сервере. Здесь ты ограничен тем, что у них на сервере есть. Большинство участников, 70–80% используют C++, еще 20% используют Java, остальных языков очень мало. Это, мне кажется, такой цикл — новые люди, которые приходят на соревнования, начинают общаться с другими, более старыми участниками, те учат новичков тому, что умеют сами. В итоге новые люди тоже начинают пользоваться теми же языками. Так что эти два языка не то чтобы как-то особенно подходили для соревнований, просто так сложилось исторически.

    То есть в жизни все это применимо? Ведь наверняка сложно найти работу, на которой эти знания пригодились бы. Да, можно пойти в Google или Яндекс, но прийти в какой-нибудь банк уже сложнее?

    Мне кажется, это очень полезная часть скилла, та часть, что отвечает за умение написать про-грамму с первого раза, без ошибок, или найти ошибку в программе товарища. Сам я в банке не работал, но мне кажется, что такие навыки пригодились бы и там. Хотя, конечно, сами алгоритмы действительно применяются не в любой работе. Но лично мне этот бэкграунд очень помогает.


    У тебя, наверное, была какая-то особая история, как ты попал в Google?

    Да нет никакой истории, все было так же, как у других. Сейчас я занимаюсь поиском (общей его частью, которая не зависит от страны и языка), но, к сожалению, не могу ничего об этом рассказывать, так как это очень конфиденциальная часть.

    Спортивное программирование: «за» и «против»

    Давай я попробую задать тебе глупый вопрос :). Почему нужно заниматься спортивным программированием, как ты считаешь?

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

    А если попытаться придумать причину, почему не стоит тратить время на спортивное программирование?

    Думаю, нужно отдавать себе отчет в том, что это — не главное в жизни. Иметь какие-то другие цели, помимо этой. Если что-то начинает занимать абсолютно всю твою жизнь, наверное, это уже повод задуматься о том, чтобы как минимум сделать перерыв.

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

    В России есть несколько человек, которые профессионально занимаются подготовкой новых спортивных программистов, — тренеры. Андрей Станкевич, Миша Мирзаянов и другие. Все они преподают в университетах, но существенную часть своего рабочего времени тратят именно на подготовку студентов и школьников к соревнованиям по программированию. Для них это действительно работа и, можно сказать, карьера.

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

    Я пробовал учить школьников в 57-й школе, где сам учился. Пробовал готовить команды к олимпиадам. Сейчас в Москве эта тема очень активна — есть команды у МГУ, Физтеха, Высшей школы экономики. Но с преподаванием у меня как-то не сложилось.

    Что до контестов, прежде всего я помогаю делать задачи для Google Code Jam, для нашего соревнования. Плюс помогаю с полуфиналом ACM, который проходит в Санкт-Петербурге. Это отбор среди российских команд и команд бывшего СССР на финал.

    Можно ли заработать на соревнованиях? Ведь за победу дают денежные призы.

    Слишком маленькая вероятность. Один приз на десять тысяч участников. Я не назвал бы это заработком. Рассчитывать на это как на основной источник дохода. мне кажется, без шансов.

    Но, как я уже сказал, есть много разных соревнований. Тот же Topcoder проводит соревнования по разработке программ. Допустим, нужно разработать компонент для программы, который делает то-то. По итогам оценивают, у кого что получилось, и лучшее используют — это решение покупает клиент и платит деньги тому, кто это решение сделал. Люди, которые занимаются этим full time, как я понимаю, зарабатывают довольно прилично.

    Контесты сегодня

    Расскажи подробнее, какие сейчас бывают соревнования, как все это происходит?

    На сегодня существует два вида контестов. Есть еженедельные, регулярные соревнования. Их проводят два основных сайта — TopCoder и Codeforces. Каждый контест занимает полтора-два часа. Там участникам дается несколько задач, которые нужно решить и послать программу на сервер. Организаторы проверяют, работает ли программа.

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

    TopCoder — самый старый и известный сайт с еженедельными контестами. У них следующие правила. На решение трех задач отводится один час пятнадцать минут.

    Задания обычно делятся на очень простые, средние и сложные. Устроители стараются подобрать их так, чтобы, скажем, пять человек решили все задачи, сто человек — две, а все остальные решили хотя бы одну. Притом для каждой задачи важно, когда ты ее отправишь, — чем позже, тем меньше ты получишь баллов. Так разделяются те люди, что решили одинаковое число задач. Потом баллы суммируются. Обычная задача стоит 250 баллов. Средняя 500. Сложная 1000. В среднем у людей с первых мест получается по тысяче с чем-то баллов за соревнование.

    Дальше делают перерыв пять минут и еще пятнадцать минут отводится на поиск ошибок у других. Можно открыть решение любого человека, по любой задаче в твоей «комнате». «Комната» — это когда люди, участвующие в соревновании, случайно разбиваются на группы по двадцать человек. Разбиваются на «комнаты». Ты можешь открыть любое решение любого человека из твоей «комнаты». Если решение кажется тебе неверным, то можно вбить входные данные, на которых оно будет неправильно. И если оно действительно дает неправильный ответ, ты получаешь за это еще 50 баллов. Это, конечно, меньше стоимости задачи. Но это опять же делается для разделения людей. Основные баллы все-таки начисляют за решение задач, а не за поиск ошибок.

    После всего этого задачи проверяются на тестах, которые готовило жюри. Если задача не работает, человек получает 0 баллов.

    Есть еще второй сайт, российский, — Codeforces. У них правила немного другие, но формат приблизительно тот же — два часа и несколько задач. Если угодно, такой формат можно назвать развлекательным, в отличие от студенческих олимпиад, которые длятся по пять часов.

    Но еще есть крупные, ежегодные контесты?

    Да, кроме двух описанных соревнований, что проходят еженедельно, есть еще множество ежегодных соревнований. Обычно они устроены так: некая крупная компания (Google, Яндекс, TopСoder, IBM) проводит соревнование, с несколькими этапами отбора. Первые этапы проходят по интернету. А финальный этап уже проводится в каком-то конкретном месте, куда свозят всех финалистов. Таких соревнований всего штук пять-десять, но они длинные, так что все время происходит какое-то из них.

    Все эти соревнования индивидуальные?

    Большинство соревнований сейчас индивидуальные. Командные — это главным образом студенческие соревнования, основное из них — ACM ICPC. И другие студенческие соревнования тоже обычно делают командными, потому что, грубо говоря, там команда уже есть. Так легче заинтересовать людей. Вот ветеранские соревнования обычно уже личные.

    Почти у всех соревнований есть некие рейтинги, самый известный у TopСoder. Что это такое?

    У еженедельных соревнований есть рейтинг, как в шахматах, который обновляется после каждого соревнования. Те, кто выступил лучше, получают плюс, кто хуже — минус. Если же ты не участвовал вовсе, рейтинг не меняется. Система построена таким образом, чтобы уравнять людей, которые бывают часто и редко. Давления «нужно участвовать постоянно» там нет. Есть много людей, которые гораздо старше меня, они появляются очень редко — раз в два месяца, — и все равно у них остается хороший рейтинг, потому что они продолжают хорошо решать задачи.

    В рейтинге TopCoder ты сейчас второй?

    Да, на первом месте Гена Короткевич, очень умный студент из Гомеля, сейчас он учится в ИТМО. На Codeforces у меня в последнее время результат похуже, сейчас я шестой или пятый. Там тоже Гена на первом месте.

    Наверное, играть в онлайне и офлайне — это совсем разные ощущения и опыт?

    Конечно. Мне кажется, очень важная положительная сторона спортивного программирования заключается в том, что все соревнования заканчиваются onsite-раундом, куда съезжаются все лучшие. Я благодаря этому познакомился со многими классными людьми со всего мира. Вообще, основной «приз» в таких соревнованиях, как мне кажется, — это именно встреча с людьми. Проводишь с ними время, общаешься, узнаешь что-то новое. Очень забавно, что людей из других стран, которые зачастую плохо говорят по-английски, тем не менее очень легко понимать, потому как у них очень похожие интересы.

    В таких соревнованиях — с отборами — обычно участвует больше народу, чем в регулярных. Если человек никогда и нигде не участвовал, еженедельные соревнования могут стать проблемой. Там такие задачи, что человек может ничего не решить и расстроиться. В соревнованиях с отборами обычно все проще, во всяком случае на первых этапах. Их основная идея заключается в том, чтобы все получили удовольствие. Опять же есть осязаемый приз в конце — денежные призы за первые места. Плюс поездка куда-либо, например в офис Google, тоже вполне себе приз.

    Бывает такое, что компании потом пытаются использовать в жизни наработки из сданных конкурсантами решений?

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

    Соревнования со временем меняются? Становятся сложнее или, наоборот, проще?

    Они становятся сложнее. Все больше алгоритмов считаются чем-то из разряда «это все должны уметь», «это все знают». Думать нужно столько же, что и десять лет назад. Шагов, чтобы построить решение, понадобится такое же количество, но базовые блоки, из которых состоит решение, стали сложнее. Люди изучили больше алгоритмов. Взять, например, суффиксное дерево: когда оно появилось, я учился в школе, и казалось, что это очень крутой алгоритм, все, кто его знает, очень умные и это вообще революция. Сейчас те же задачи решаются с помощью суффиксного автомата, а это очень простой алгоритм, который занимает десять строк. То есть стандартные вещи научились здорово упрощать. Поэтому сейчас решают более сложные задачи.

    О задачах и их составлении

    Как составляют задания для соревнований? Есть составители, люди, которые уже умеют это делать, или это некий краудсорсинг, где каждый может предложить что-то свое?

    В упомянутых еженедельных соревнованиях именно так: каждый может предложить свою задачу. Но существует требование, чтобы человек до этого поучаствовал в достаточном числе соревнований. Своего рода проверка, понимает ли человек, о чем вообще должны быть задачи. После можно отправлять свои задания, и жюри ответит, можно ли их использовать, подходят ли они. Если задачи подходящие, их потом дают на соревнованиях, а автору платят за это деньги — не очень большие, но все же.

    Придумывать такие задачи — это ведь особый скилл?

    О да. Можно придумывать задачи, отталкиваясь от решений. Скажем, ты прочитал какую-то статью в научном журнале про интересный алгоритм. Или просто нашел некий алгоритм и вспомнил, что раньше с ним сталкивался, но в последнее время давно его не видел. Можно придумать задачу, которая требует его использования.


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

    Авторы часто пытаются сделать задачи ближе к реальности, используют термины из жизни?

    Есть соревнования разной степени приближенности к жизни. Обычно задача на соревнованиях дается не в каких-то формальных терминах, вроде «дано: решить уравнение такое-то». Обычно как раз дается некий бэкграунд, история. Как в школьных учебниках по математике: «По одной трубе втекает десять литров воды в минуту». Поэтому сначала нужно как-то формализовать эту историю, найти в ней математическую задачу, а уж потом решать.

    Бывают и другие соревнования. У TopCoder это называется Marathon Match, и другие компании тоже проводят подобные контесты. Они устроены немного иначе. Это уже соревнования не по алгоритмам, а по решению приближенных задач. Когда нет точного решения и нужно придумать вариант как можно лучше. Такие соревнования длятся обычно две недели, месяц. Можно присылать разные решения и наблюдать, что, ага, вот сейчас мое решение лучше остальных на 20%.

    «Лучше» — в смысле быстрее, использует меньше памяти и так далее?

    Да. К примеру, нужно придумать схему распределения движения автобусов по карте Москвы, чтобы использовать как можно меньше автобусов. То есть в условии задачи есть некий параметр, который нужно оптимизировать, но единого «верного решения» не существует, только какие-то приближенные алгоритмы.

    Тот же Topcoder проводил соревнования вместе с NASA, и они говорят, что решения, которые им предложили, потом действительно адаптировали и использовали на МКС. Там решали какую-то конкретную задачу, кажется, как поворачивать солнечную батарею, чтобы та получала больше энергии.

    С чего начать

    С точки зрения подготовки хорошего алгоритмического программиста и участника разных контестов — как подготовить себя к такому? Если представить себя на месте старшеклассника или студентов первых курсов?

    Мне кажется, самый стандартный способ — это попробовать. У всех соревнований доступен архив проводившихся ранее контестов, там тысячи задач, которые можно порешать в любое время.

    А если я беру задачу и вообще не знаю, с какой стороны к ней подойти?

    Значит, возьми попроще. Они ведь разные. Есть задачи, которые может решить каждый второй выпускник школы. Там совершенно разные уровни сложности. Втянуться должно быть довольно легко. Другого способа, как мне кажется, нет. Плюс таким образом ты сразу поймешь, нравится тебе эта деятельность или нет.

    Что нужно делать, чтобы набрать алгоритмическую базу? Вряд ли нужно прямо сразу кидаться читать Кнута.

    Мне кажется, начинать нужно именно с задач. Уже потом, когда ты поймешь, что не можешь решить какую-то конкретную из них, в этих соревнованиях у каждой есть разбор. Можно прочитать решение, если справиться самостоятельно не получается. Например, в разборе указано, что в решении задачи используется некий алгоритм. Можно почитать, что это за алгоритм, где еще он применяется.Так лучше, чем читать по списку «ага, у меня есть алгоритм, который мне нужно изучить за лето». Лучше отталкиваться от конкретной задачи, которую ты не смог решить, потому что не знаешь какой-то конкретный алгоритм. Это более правильно. Запоминаешь лучше, мотивация получается сильнее. Такой способ изучения алгоритмов, наверное, дольше, чем по списку, но он приводит к лучшим результатам.

    Если хочется «прокачать» себя именно по алгоритмам, есть какая-то литература, учебники?

    Самый стандартный учебник — Кормен, Лейзерсон, Ривест с ослом на обложке. «Алгоритмы: Построение и анализ» называется. Не знаю, я довольно давно не учился, сейчас наверняка есть новые учебники, которые могут быть лучше. Но в мое время использовали Кормена. Кнут — это, скорее, этакий reference book. Если что-то нужно найти и оно нигде не находится, скорее всего, там оно будет. Но читать Кнута подряд. это довольно грустное занятие.

    Хорошие задачи для подготовки по курсу Алгоритмы и структуры данных

    В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 10 мес., 3 нед. назад.

    Материал не мой. Автора найти не удалось. Тем не менее, крайне полезный. Собственно ниже приведен список очень хороших, на мой взгляд, задач по алгоритмам и структурам данных, а также требования какого-то (видимо очень крутого) ВУЗа к их оформлению.

    Зачем это тут?
    — С одной стороны это может быть интересно адекватным студентам, мечтающим стать хорошими программистами, а не быдлом. Задачи такого типа дают на собеседованиях, в приличных конторах. Потому что если вы хотя бы предложите подход к их решению — можно с уверенностью сказать, что вы читали какие-то полезные книжки, а не кололись.

    — С другой — преподавателям. Не только чтобы в конец охренеть от того, что в этой стране еще где-то пытаются учить нормально, но и чтобы что-то утащить в свои курсы.

    Если вдруг тут найдутся желающие решать эти задачи — буду рад помочь в рамках форума.

    Дальше материал какого-то хорошего преподавателя и человека:

    Общие условия

    Программа должна быть реализована на одном из языков: C/C++, Python, Kotlin, Java, Haskell, Scala. Прочие — по договоренности с преподавателем. Программа должна быть платформонезависимой, не иметь зависимостей от нестандартных библиотек и выполнена в виде консольного приложения.

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

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

    Программа должна быть покрыта тестами. Тесты должны содержать проверку корректности всех основных реализованных алгоритмов. Каждый тест представляет собой два текстовых файла с одинаковым именем, но разным расширением (например, 001.dat и 001.ans) в формате входных и выходных данных соответственно. Приветствуется предоставление отчета о покрытии разработанной программы тестами.

    К программе должен прилагаться краткий отчет в формате PDF, содержащий:
    • теоретическую часть, которая не зависит от реализации;
    • краткую инструкцию по использованию (и компилированию) программы;
    • краткое описание логики программы, описывающую специфику конкретной реализации;
    • подробное описание формата входных и выходных данных;
    • подробное описание каждого теста;
    • оценку сложности основных алгоритмов программы, с доказательством.
    • оценку использования памяти основными алгоритмами, с доказательством.

    До 1 ноября студент должен предоставить на почту преподавателю промежуточный отчет, содержащий теоретическую часть, форматы входных и выходных данных, и план решения задания.

    Домашнее задание, включающее исходный код программы, тесты и отчет, должно быть отправлено на e-mail преподавателя до 12 декабря. После проверки преподавателем домашнее задание подлежит защите, после которой выставляется итоговая оценка.

    Студент может размещать результаты работы в публично доступном репозитории с веб-интерфейсом (например, GitHub). В таком случае допускается оформление отчета в виде одного или нескольких файлов формата Markdown, а на почту преподавателю можно присылать только ссылку на репозиторий.

    Если студента не устраивают предложенные варианты, то не позднее, чем до 1 октября, он может предложить свой вариант домашнего задания, позволяющий, на его взгляд, продемонстрировать его навыки использования алгоритмов и структур данных (в том числе на основе предлагаемых задач).

    Структуры данных

    В программе должна присутствовать реализация операций вставки, поиска, удаления, получения минимального и максимального элементов и других, специфичных для указанных структур данных. Реализация структур данных должна быть инкапсулирована.

    Входной файл содержит последовательность команд, т. е. представляет набор строк вида

    command [key] [data]

    , где command — add, delete, search, min, max, print или спец. команда;
    key — ключ, целое число;
    data — данные, целое число.

    Команда print должна отражать внутреннее строение структуры данных, а ее формат вывода должен быть описан в отчете.

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

    Тесты для каждой из структур предоставляются отдельно.

    В практической части для всех сценариев должна быть предоставлена информация о скорости работы сравниваемых структур данных и сделаны выводы о результатах сравнения.
    1. Сравнить список с пропусками и АВЛ-дерево.
    2. Сравнить структуру данных Rope (веревка) и обычную строку.
    3. Сравнить хэш-таблицу, отсортированный массив и любое из самобалансирующихся деревьев поиска.
    4. Сравнить LSM-дерево и любое из самобалансирующихся деревьев поиска.
    5. Сравнить vEB-дерево и любое из самобалансирующихся деревьев поиска.

    Алгоритмы


    Формат входного(ых) файла студент выбирает самостоятельно. Выходной файл содержит результат работы алгоритма. Реализация алгоритма должна быть инкапсулирована. В отчете необходимо описать используемые структуры данных и обосновать их выбор.

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

    Если студент доказывает, что его задача является NP-полной (или NP- трудной), то допускается использование приближенных и/или эвристических алгоритмов для ее решения. При этом необходимо предоставить оценку точности решения.

    6. Построить абстрактное синтаксическое дерево программы. Вход — исходный код программы на выбранном студентом языке общего назначения.
    7. Написать программу для решения судоку произвольного размера.
    8. Некое заведение общепита очень любит акции. Акции заключаются либо в назначении сниженной цены за комбинацию продуктов, либо в предоставлении бесплатного продукта при покупке определенной комбинации продуктов. Напишите алгоритмы для определения набора акций такого, чтобы:
    a. купить желаемый набор продуктов максимально выгодно.
    b. максимально сытно поесть на фиксированную сумму.

    Вход — меню (с ценами и калорийностью), акции, набор продуктов или сумма. Подсказка: Задача a может быть решена с помощью алгоритма для решения задачи b.

    9. Пусть есть некоторое закольцованное игровое поле и набор правил для перемещения по нему (перемещение на несколько клеток вперед или назад, перемещение на клетку с определенным номером). Примеры правил: «переместиться на такую-то клетку», «отойти на три клетки назад». Начальное перемещение задается броском двух кубиков, при выпадении дубля можно ходить еще раз, но три дубля подряд завершают ход. Определите условия, при которых игрок пройдет максимальное количество клеток за один ход. В качестве примера можно взять игру «Монополия».

    10.Представьте, что вы являетесь разработчиком стратегии реального времени. Допустим, игрок может создавать на карте здания-приемники (амбары, лесопилки, кузницы и т. д.). В них поступают ресурсы с прилегающих территорий (зерно, лес, руда и т. д.). При имеющемся расположении приемников необходимо поделить всю карту на непересекающиеся области таким образом, чтобы в каждой области был ровно один приемник и он был ближайшим для всех ресурсов в этой области. Можно считать, что препятствий на карте нет.

    11.Реализуйте алгоритм, который по входному недерминированному конечному автомату строит детерминированный и эмулирует его.

    12.Сравните производительность алгоритмов разбиения графов на компоненты связности, основанные на различных алгоритмах поиска (например, BFS), и алгоритма использующего систему непересекающихся множеств (DSU).

    13.Напишите программу, эмулирующую простой процессор (можно взять за основу, например, MSP430).

    14.У преподавателя есть список заданий, каждое из который имеет тип (теория/практика/блиц/прочие), тематику и уровень сложности. Постройте алгоритм для генерации списка билетов, такой, чтобы одновременно выполнялись условия:
    1) в зависимости от внешних условий состав билетов меняется;
    2) билет содержит одинаковое количество вопросов из разных тем, и одинаковое соотношение заданий разных типов (например, 2 теории и одна практика);
    3) уровень сложности всех билетов приблизительно одинаковый.

    15.Преподавателю надо печатать билеты и при этом потратить как можно меньше бумаги. Упорядочите билеты так, чтобы они занимали наименьшее число листов A4, между ними было место для разреза, у листа были поля сверху и снизу и ни один билет не оказался «разорван» между листами.

    16.Постройте программу для решения головоломки «Пятнашки» произвольного размера.

    17.Напишите программу для получения минимальной ДНФ булевой функции.

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

    19.Предположим, что вы устроились погромистом в некую успешную компанию. Вам поручили автоматизировать составление сменного графика работы сотрудников. В зависимости от должности, каждый сотрудник должен отработать определенное число дней в месяц (например, 22 из 30) по сменному графику. Каждый из сменных работников отправляет желаемое расписание на месяц, а ваша задача — составить график так, чтобы максимально удовлетворить все заинтересованные стороны (сделать меньше всего изменений в графиках работников и избежать случая, когда в один день на работе 10 сотрудников, а в другой — ни одного). Помните, что число дней в месяце может быть разным.

    20.Постройте алгоритм для игры в шашки, который предлагает лучший ход для позиции, переданной во входных данных.

    21.Реализуйте алгоритм для игры в «Наборщика» (составить все возможные слова из входного слова).

    22.Реализуйте алгоритм проверки орфографии с помощью BK-дерева.

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

    24.Реализуйте алгоритм для поиска похожих изображений.

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

    26.Реализуйте алгоритм для игры в «быки и коровы».

    Приложение

    Список абстракций, задач, методов, алгоритмов и структур данных, которые могут пригодиться при выполнении домашнего задания.
    • Алгоритм A*
    • Алгоритм Дейсктры
    • Алгоритм LZW
    • Алгоритм Барроуза-Уилера
    • Задача об упаковке в контейнеры (и ее вариант offline-2DSP)
    • Задача о покрытии множества
    • Диаграммы Вороного
    • Метод ветвей и границ
    • Задача о рюкзаке
    • Задача коммивояжёра
    • Интервальное дерево
    • Задача ЦЛП
    • Алгоритм Прима
    • Алгоритм Крускала
    • Задача Штейнера
    • BSP-дерево
    • Конечный автомат
    • Генетические алгоритмы
    • Латинский квадрат
    • Полимино
    • Граф Кэли
    • Система непересекающихся множеств

    Школа программирования для 6-9 классов. Изучение алгоритмов

    Первые шаги к получению одной из самых востребованных профессий

    Первые шаги к получению одной из самых востребованных профессий

    Освоение базовых и продвинутых навыков программирования

    Набор в школу закрыт!

    С 29 июня по 4 июля на базе ГБОУ ДООЦ «Команда» пройдет Летняя выездная школа по программированию. Это прекрасная возможность в течение всего 6 дней получить полезные практические навыки и представления о будущей профессии и совместить обучение с активным отдыхом.

    Образовательная программа будет разделена на базовое и углубленное направления.

    • Базовое направление предусмотрено для школьников, которые никогда не занимались программированием. Они полностью освоят синтаксис языка программирования Python, его алгоритмы и принципы создания полноценных проектов. В дальнейшем на нем можно будет писать различные проекты и применять в рабочих целях, а также использовать на олимпиадах и ЕГЭ по информатике.
      Ученики начнут с написания мини-игр «Устный счет на время» или «Угадай число», а закончат полноценными небольшими проектами с графическим интерфейсом (GUI) и двигающимися графическими объектами.
      Также школьники узнают, как в современном мире происходят хакерские атаки, как можно повлиять на ход игры или выиграть, изменив всего несколько значений в коде данной игры. Их будет ждать увлекательное соревнование в игре, которую они напишут сами.
    • Углубленное направление – для школьников, которые имеют опыт программирования и хотят развиваться дальше. Они смогут получить углубленную алгоритмическую подготовку и развить навыки решения алгоритмических, оптимизационных и логических задач по программированию.
      В течение курса учащиеся изучат алгоритмы для обработки больших массивов данных, оптимизации обработки данных и решения олимпиадных задач по программированию, пройдут некоторые темы из дискретной математики: теория графов и комбинаторика. Также изучат алгоритмы сортировки, методы обхода графов и нахождения кратчайших путей в графе, бинарный поиск и принцип решения задач «Динамическое программирование». Во время обучения ребята будут решать контесты (наборы задач) на сервере, где автоматически все решения тестируются и составляется таблица результатов, по которой выстраивается рейтинг.

    Соревнования по программированию. Ученики обоих направлений смогут принять участие в соревнованиях. Для базового – по решению алгоритмических задач, для углубленного – командное и личное соревнования, аналогичные реальным соревнованиям по программированию. Они узнают, как лучше готовиться к ним в дальнейшем, поступить в престижный университет и устроиться работать в престижную IT-компанию.

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

    Чему вы научитесь:

    Базовое направление:

    • Узнаете основы и базовые принципы программирования и разработки проектов.
    • Изучите язык программирования Python, базовые алгоритмы и структуры данных.
    • Напишете небольшие проекты и игры, создадите графический интерфейс GUI.
    • Примете участие в соревновании по решению алгоритмических задач.
    • Увидите более полную картину мира IT и определитесь с дальнейшим развитием.

    Углубленное направление:

    • Узнаете основные принципы решения алгоритмических и оптимизационных задач по программированию.
    • Изучите основные структуры данных, алгоритмы для работы с графами, алгоритмы сортировки и обработки строк.
    • Узнаете принципы решения задач методом «Динамическое программирование».
    • Примите участие в тренировочных командных и личных соревнованиях по программированию.

    Для кого

    • Школьники, которые хотят освоить основы и принципы программирования, но пока еще не разбираются в данной теме.
    • Школьники, имеющие базовые навыки программирования и желающие их углубить.

    Преимущества обучения:

    • Высококвалифицированные преподаватели.
    • Эффективное сочетание теоретических и практических занятий.
    • Получение консультаций преподавателей в течение всего дня, а не только на занятиях.
    • Возможность профориентации.
    • Общение и обмен опытом с другими школьниками.
    • Насыщенная культурно-досуговая программа.

    Формат школы

    В день будет проходить 3-4 пары по 1,5 часа. Половина времени будет уделена теоретическим лекциям, другая половина – практическим занятиям, где преподаватель поможет школьникам писать красивый и рабочий программный код.

    Мастер Йода рекомендует:  Как добавить свой сайт в поисковую систему Google
    Добавить комментарий