Комментарии кураторов
Android Developer
Во время тестирования на первом этапе проверялось знание базового Computer Science, немного Android, немного Rx.
Самая частая проблема,
Далеко не все сделали то, что было в базовом списке требований, например нормальное кэширование. Если есть закэшированные данные — приложение должно продолжать работу офлайн. Кроме того, должен был поддерживаться переворот экрана (как частный случай сохранения состояния).
Также у нас есть категория бонусных баллов при проверке. Они выставлялись за дополнительные плюшки вроде network checker’а, тестов, темной темы и реализации нескольких табов. Однако это скорее исключение и таких работ немного. В основном при оценке работ ориентировались на чистое исполнение согласно ТЗ.
iOS Developer
Во время тестирования на первом этапе проверялось знание Swift, паттернов, базового Computer Science.
Мы обращали внимание на множество исключительных сценариев и следили за тем, чтобы приложение не крашилось в рамках этих сценариев. Больше всего баллов получали работы, в которых не только идеально выполнены дополнительные задания, но и добавлены крутые фичи, которые делали из небольшого приложения практически полноценный продукт. Немаловажным пунктом была чистота кода и его аккуратность, а также архитектурные решения.
На что стоит обратить внимание в следующий раз: если выполненное дополнительное задание приводит к крашу приложения, задание не засчитывается.
В среднем у поступивших ребят есть три частично решенные задачи. При нижних порогах баллов (200) большую роль играла анкета.
Брали лучших на основе результатов экзамена по программированию и тестирования, из них отбирали тех, кто сможет уделять достаточное время курсу. При прочих равных приоритет отдавали тем, кто хотел бы дальше развивать полученные навыки в рамках
В среднем у поступивших участников есть хотя бы две частично решенные задачи. При нижних порогах баллов (215) большую роль играла анкета.
В этом запуске набирали небольшую группу, поэтому отбор был достаточно жестким. В первую очередь смотрели на баллы по программированию, интерес к направлению (расставленные приоритеты в анкете), готовность к работе после окончания курса.
В среднем у поступивших ребят есть три частично решенные задачи. При нижних порогах баллов (270) большую роль играла анкета.
Для начала мы отбирали наиболее заинтересованных именно в нашем курсе людей, выбрали тех, у кого
Брали лучших на основе результатов экзамена по программированию, из них отбирали тех, кто сможет уделять достаточное время курсу и курсовой работе. Внимательно изучали ответы на вопросы анкеты и информацию, которую оставили о себе участники.
Особенно отмечали кандидатов, указавших, что им хотелось бы продолжать развивать полученные навыки в рамках
Системный и бизнес-анализ
Крайне важна мотивация. Курс объемный и непростой. Брали тех, у кого системный анализ стоял первым приоритетом.
Далее смотрели на результаты тестов. При этом старались фильтровать так, чтобы из разных регионов было примерно одинаковое количество заявок. Но приоритет был у Питера, Нижнего, Москвы, Рязани — при подаче заявки подчеркивали, что приоритет у участников из этих регионов.
После этого проверяли задания с открытым ответом, смотрели на ход мысли того, кто решал. Если решение было в одну строчку без описания, почему так, то это был незачет.
Еще в этом году в качестве эксперимента было несколько очень маленьких заданий, связанных с программированием. Сразу отсекали тех, кто просто скопировал готовое решение, а не попытался сделать сам.
Ну и по классике SQL. В топ поднимались студенты, которые не попались в ловушки. А дальше уже просто смотрели на качество решения. Если на этом этапе оставались студенты, которые были
Прикладная статистика
Смотрели сначала на математику — прошли люди с минимум двумя верными ответами из пяти. Потом — на решения задач по теории вероятностей: понимает ли человек, что такое условная вероятность (первая задача), понимает ли, как обращаться с плотностями распределений (вторая задача). Потом на Python, но с задачей номер четыре справились очень многие, поэтому нельзя сказать, что она была решающей.
Взяли всех, кто допустил не больше одной ошибки в этих четырех задачах.
И одновременно с этим решил не меньше двух задач из части по общей математике.
Границу эту выбрали так: оценили, скольких людей готовы взять на курс (чтобы успевать вовремя проверять домашние задания) и просмотрели анкеты. В промежутке «топ 40—60 кандидатов» посмотрели, что пишут в анкетах: заинтересованность, опыт олимпиад, курсовые, стажировки.
Продуктовая аналитика
В первую очередь выбор делали по результатам решения задач по логике, далее оценивали решение
Как оценивали решение
- Пользователь описывал только то, что ему лично неудобно пользоваться сайтом, и не пытался проанализировать, как это влияет на конверсию сайта (помним, что «я нерепрезентативен»).
- Кейс был описан очень кратко (в прямом смысле у некоторых было
две-три строчки текста).
Повышали оценку, если:
- В кейсе рассматривали сегменты пользователей (это требовалось в задании, но мало кто об этом писал).
- Предлагая улучшение на сайте, в обосновании писали данные исследований или статистические данные (так как если у аналитика есть возможность найти данные и использовать их для улучшения гипотез, это нужно делать).
- Улучшения описывались в виде продуктовой гипотезы (то есть мы предполагаем, что вот такое изменение на сайте приведет к следующему изменению в поведении посетителей сайта).
- В кейсе были предложены «сложные» изменения (то есть не шрифт увеличить, а добавить
какую-то новую механику или новую продуктовую фичу).
Управление проектами и продуктами
В первую очередь выбор делали по результатам решения задач по логике и математике, далее оценивали
Как оценивали
- Участники отвечали поверхностно и не раскрывали тему глубже. Например, третий кейс: руководитель КЦ снизил нагрузку на 20% за неделю. Что он сделал? Участники, ответившие односложно «Ввел голосового робота» без объяснения причин, процессов, результатов и не рассмотрели другие возможные варианты, получали оценку ниже.
- Участники отвечали не на все вопросы, поставленные в кейсе. Например, многие пропускали вопрос про
value/оценку рынка. - Если не было обоснования гипотез через цифры.
Оценка повышалась, если:
- Приводились данные исследований или статистические данные.
- В ответе было больше одной идеи.
Отбирали на основе результатов экзаменов. Первый фильтр — решение теста, далее смотрели на решение заданий по Excel, последний фильтр — анкета. Помимо этого отбирали наиболее заинтересованных в нашем курсе: тех, у кого наш курс был первым или вторым по приоритетности.
Разбор задач контеста
Задача A. Пополам
Имя входного файла: | стандартный ввод |
Имя входного файла: | стандартный вывод |
Ограничение по времени: | 1 секунда |
Ограничение по памяти: | 256 мегабайт |
Вам дана строка S длины 4, состоящая из заглавных букв латинского алфавита. Определите, правда ли, что S состоит из двух различных букв, каждая из которых встречается дважды.
Вам нужно ответить на T независимых наборов входных данных.
Формат входных данных: первая строка теста содержит одно целое число T (1≤ T ≤ 100) — количество наборов входных данных. Затем следуют T наборов входных данных. В первой строке набора входных данных вводится строка S (|S| = 4).
Формат выходных данных: для каждого набора входных данных выведите ответ на него — «Yes», если S состоит из двух букв, каждая из которых встречается дважды, и «No» иначе.
Пример:
Стандартный ввод | Стандартный вывод |
---|---|
4 | YES |
ABBA | YES |
GOGO | NO |
FIRE | NO |
WAPP |
Решение: чтобы проверить данный критерий, можно отсортировать символы в строке и проверить, что первый символ равен второму, третий — четвертому, а второй и третий не равны.
Задача B. Вокруг да около
Имя входного файла: | стандартный ввод |
Имя входного файла: | стандартный вывод |
Ограничение по времени: | 1 секунда |
Ограничение по памяти: | 256 мегабайт |
Вдоль круглого пруда с периметром K расположены N деревень.
Вы можете начать и закончить свое путешествие в любой деревне, при этом вы можете передвигаться только вдоль границы пруда.
Найдите минимальное расстояние, которое вам придется преодолеть, чтобы посетить все N деревень.
Формат входных данных: в первой строке вводятся два числа K и N (2 ≤ K ≤ 106, 2 ≤ N ≤ 2*105) — периметр пруда и количество деревень соответственно.
В следующей строке вводятся N чисел Ai (0 ≤ Ai< K) — расстояния от самой северной точки пруда до деревень. Гарантируется, что A1<A2<…<An.
Формат выходных данных: выведите одно число — минимальное расстояние, которое необходимо пройти, чтобы посетить все N деревень.
Пример:
Стандартный ввод | Стандартный вывод |
---|---|
20 3 5 10 15 | 10 |
20 3 0 5 15 | 10 |
Замечание: в первом примере можно начать путешествие в деревне 1, затем посетить деревню 2, а затем деревню 3. Суммарная длина такого путешествия будет равна 10.
Во втором примере можно начать путешествие в деревне 3, затем посетить деревню 1, а затем деревню 2. Суммарная длина такого путешествия будет равна 10.
Решение: рассмотрим N дуг, соединяющие соседние деревни. Можно заметить, что нам точно будет необходимо преодолеть N − 1 дугу, при этом этого достаточно, чтобы посетить все города.
Поэтому мы можем выбрать из этих N дуг N − 1 самую короткую и составить маршрут, проходящий только через эти дуги и посещающий все города.
Задача C. Больше бревен!
Имя входного файла: | стандартный ввод |
Имя входного файла: | стандартный вывод |
Ограничение по времени: | 1 секунда |
Ограничение по памяти: | 256 мегабайт |
У вас есть N бревен, длина
Выбрать одно из N бревен и разрезать его. Когда вы разрезаете бревно длины L на расстоянии
t (0 < t < L, t может быть нецелым) от его конца, оно превращается в два бревна длины t и L − t соответственно.
Найдите минимальную длину самого длинного из бревен после того, как вы сделаете не более K операций. Выведите это число с округлением до ближайшего целого вверх.
Формат входных данных: в первой строке вводятся два числа —
N и K (1 ≤ N ≤ 2*105, 0 ≤ K ≤ 109) — количество бревен и разрезов соответственно.
Во второй строке вводятся N чисел Ai (1 ≤ Ai ≤ 109) — длины бревен.
Формат выходных данных: выведите одно число — минимальную длину самого длинного бревна после разрезов, округленную вверх.
Стандартный ввод | Стандартный вывод |
---|---|
2 3 7 9 | 4 |
3 0 3 4 5 | 5 |
Решение: воспользуемся бинарным поиском по ответу. Так как ответ — это, возможно, нецелое число, округленное вверх, будем делать бинарным поиском по округленному числу.
Научимся проверять, сможем ли мы за К разрезов сделать длины всех бревен ≤ Х (
Чтобы сделать все кусочки бревна длины i и не длиннее Х, нам потребуется разрезов. Таким образом, если
то мы сможем сделать все бревна не длиннее К, а иначе — нет.
Задача D. Круговое путешествие
Имя входного файла: | стандартный ввод |
Имя входного файла: | стандартный вывод |
Ограничение по времени: | 1 секунда |
Ограничение по памяти: | 256 мегабайт |
В одном государстве существует N городов, связанных двухсторонними дорогами. Изначально для каждой пары городов существовала дорога, соединяющая их напрямую. Однако потом вышел указ, по которому M дорог были разрушены. Были разрушены дороги между городами U1 и V1, U2 и V2 и так далее.
Вам стало интересно, сколько существует способов совершить круговое путешествие длины K из города 1: начать путь в городе 1, проехать ровно по K дорогам и вернуться в город 1.
Более формально, круговым путешествием длины K из города 1 называется такая последовательность городов A1, A2, … AK, AK+1, что города Ai и Ai+1 (1 ≤ i ≤ K) соединены дорогой
и A1 = AK+1 = 1. Вам нужно найти количество различных круговых путешествий длины K. Два путешествия A и B длины K считаются различными, если найдется такое j, что 1 ≤ j ≤ K + 1 и Aj≠ Bj.
Так как это количество может быть большим, выведите его по модулю 998244353.
Формат входных данных: в первой строке вводятся три числа . В следующих M строках вводятся по два числа U и V (1 ≤ U < V ≤ N) — описания удаленных дорог.
Формат выходных данных: выведите одно число — ответ на задачу по модулю 998244353.
Стандартный ввод | Стандартный вывод |
---|---|
3 1 4 2 3 | 4 |
3 3 3 1 2 1 3 2 3 | 0 |
5 3 100 1 2 4 5 2 3 | 428417047 |
Замечание: в первом примере существуют четыре различных путешествия:
- (1, 2, 1, 2, 1).
- (1, 2, 1, 3, 1).
- (1, 3, 1, 2, 1).
- (1, 3, 1, 3, 1).
Решение: воспользуемся динамическим программированием. Обозначим за dp[i][j] количество последовательностей (A0,A1,… Ai-1) и Ai-1= j. Тогда ответ на задачу — dp[k+1][1].
Теперь научимся пересчитывать это динамическое программирование. dp[i][j]=∑dp[i-1][j], по всем i, j, таким, что дорога между городами i и j есть дорога. Это будет решение за O (N3).
Заметим, что граф — почти полный (не хватает
Задача E. Подсчет последовательностей
Имя входного файла: | стандартный ввод |
Имя входного файла: | стандартный вывод |
Ограничение по времени: | 1 секунда |
Ограничение по памяти: | 256 мегабайт |
Вам даны два натуральных числа N и M.
Найдите количество последовательностей целых чисел A длины N, таких, что:
1. 0 ≤ Ai (i = 1, 2, 3,..., N)
2. ∑Ni=1 Ai = M
3. A1 ⊕ A2 ⊕ . . . AN = 0 (⊕ обозначает xor — исключающее ИЛИ).
Так как ответ может быть большим, выведите его по модулю 998244353.
Формат входных данных: в первой строке вводятся два числа N и M (1 ≤ N, M ≤ 5000).
Формат выходных данных: выведите одно число — количество таких последовательностей A по модулю 998244353.
Пример:
Стандартный ввод | Стандартный вывод |
---|---|
2 2 | 1 |
5 4 | 15 |
5 20 | 475 |
Решение: рассмотрим все числа, у которых есть бит i. Так как xor всех чисел равен 0, то количество таких чисел четно.
Теперь воспользуемся методом динамического программирования. Обозначим за dp[i][j] количество последовательностей А длины N, таких, что
A1+A2+...+ AN=j, A1 ⊕ A2 ⊕ . . . AN =0 и все элементы А состоят из чисел, меньших 2i (то есть содержащие только биты от 0 до i-1).
Ответ на задачу — это dp[L][M], где 2L>M (например, можно взять L=20).
Научимся делать пересчеты динамики. Чтобы сделать переход из состояния (i,j), переберем количество чисел х, в которых есть бит i (x должно быть четным). Количество способов выбрать х элементов из N равно CNx. Таким образом, мы переходим в состояние (i+1, j+x*2i)CNx способами. Таким образом, переход от слоя i к слою i+1 будет работать за .
Биноминальные коэффициенты можно преподсчитать за N2≤ а, переходы динамики будут работать за