Codenrock
УчастникСредний15 мин

CODING: Задачи на программирование

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

Содержание

# CODING: Задачи на программирование Задачи типа CODING — это классические алгоритмические задачи, где нужно написать код, который проверяется автоматически на наборе тестов. Это основной формат для алгоритмических соревнований. ## Как устроена задача ### Структура задачи Каждая CODING задача включает: | Раздел | Описание | |--------|----------| | **Условие** | Описание задачи, что нужно сделать | | **Формат входных данных** | Что получает программа на вход | | **Формат выходных данных** | Что должна вывести программа | | **Ограничения** | Лимиты по времени и памяти | | **Примеры** | Публичные тесты с входами и выходами | | **Редактор кода** | Monaco Editor для написания решения | ### Ограничения (лимиты) Для каждой задачи установлены ограничения: | Ограничение | Типичные значения | Описание | |-------------|-------------------|----------| | **Время** | 1-5 секунд | Максимальное время выполнения на один тест | | **Память** | 256-512 МБ | Максимальный объём используемой памяти | > **Важно**: Ограничения указаны для одного теста. Ваша программа запускается отдельно для каждого теста. ### Публичные и скрытые тесты | Тип теста | Что видите | Описание | |-----------|------------|----------| | **Публичные** | Вход и выход | Примеры из условия, можно проверить локально | | **Скрытые** | Только результат | Основная часть тестов, не видны до отправки | --- ## Поддерживаемые языки Доступные языки зависят от конкурса. Обычно поддерживаются: | Язык | Версия | Когда использовать | |------|--------|-------------------| | **Python** | 3.11 | Простота, быстрое написание | | **C++** | C++17 | Максимальная скорость | | **Java** | 17 | Удобные структуры данных | | **JavaScript** | Node.js 18 | Если знаете JS лучше всего | | **Go** | 1.21 | Скорость + простота | | **Rust** | 1.70 | Безопасность и скорость | | **C#** | .NET 7 | Удобный синтаксис | > **Совет**: Выбирайте язык, который знаете лучше. Python удобнее для прототипирования, C++ быстрее для тяжёлых задач. --- ## Процесс решения задачи ### Шаг 1: Изучите условие 1. **Прочитайте задачу полностью** — не пропускайте ничего 2. **Разберите примеры** — они показывают формат и логику 3. **Обратите внимание на ограничения**: - Диапазон входных данных (влияет на выбор алгоритма) - Лимит времени (влияет на сложность алгоритма) - Лимит памяти (влияет на структуры данных) ### Шаг 2: Напишите решение 1. **Выберите язык** из выпадающего списка 2. **Напишите код** в редакторе (Monaco Editor с подсветкой синтаксиса) 3. **Используйте шаблон** — некоторые задачи имеют начальный код ### Шаг 3: Запустите Кнопка **«Запустить»** отправляет код на проверку: 1. Код компилируется (для компилируемых языков) 2. Запускается на всех тестах 3. Результаты показываются в панели результатов > **Важно**: Run — это проверка без сохранения. Можно запускать многократно для отладки. ### Шаг 4: Анализируйте результаты После запуска вы видите: | Информация | Описание | |------------|----------| | **Статус** | Общий результат (Accepted, Wrong Answer, и т.д.) | | **Пройдено тестов** | Например, 8 из 10 | | **Время** | Среднее время выполнения | | **Память** | Средний объём памяти | | **Детали по тестам** | Для публичных тестов — ваш вывод | ### Шаг 5: Сохраните решение Когда результат вас устраивает: 1. Нажмите **«Сохранить»** — решение фиксируется для подсчёта баллов 2. В некоторых соревнованиях учитывается лучший результат из всех сохранений --- ## Запустить vs Сохранить: в чём разница? | Действие | Запустить | Сохранить | |----------|----------|-----------| | **Что делает** | Проверяет код на тестах | Фиксирует результат | | **Влияет на баллы** | Нет | Да | | **Можно повторить** | Да, сколько угодно | Зависит от лимита попыток | | **Когда использовать** | Для отладки и проверки | Когда уверены в решении | > **Примечание**: Во время выполнения кнопка «Запустить» меняется на **«Остановить»** — можно прервать проверку. ### Сценарий работы ``` 1. Написали решение 2. Запустить → увидели WA на тесте 3 3. Исправили ошибку 4. Запустить → все тесты пройдены 5. Сохранить → решение сохранено, баллы начислены ``` --- ## Вердикты проверки ### Успешные вердикты | Вердикт | Сокращение | Значение | |---------|------------|----------| | **Accepted** | AC | Все тесты пройдены | | **Partial** | — | Часть тестов пройдена (частичные баллы) | ### Ошибки в решении | Вердикт | Сокращение | Причина | Что делать | |---------|------------|---------|------------| | **Wrong Answer** | WA | Неверный ответ | Проверьте логику алгоритма | | **Presentation Error** | PE | Неверный формат вывода | Проверьте пробелы, переносы строк | ### Ошибки выполнения | Вердикт | Сокращение | Причина | Что делать | |---------|------------|---------|------------| | **Time Limit Exceeded** | TLE | Превышено время | Оптимизируйте алгоритм | | **Memory Limit Exceeded** | MLE | Превышена память | Уменьшите использование памяти | | **Runtime Error** | RE | Ошибка при выполнении | Проверьте деление на 0, выход за границы | | **Compilation Error** | CE | Ошибка компиляции | Исправьте синтаксис | ### Как читать результат ``` Тест #1: Accepted (45 ms, 12 MB) Тест #2: Accepted (52 ms, 12 MB) Тест #3: Wrong Answer (38 ms, 12 MB) Тест #4: Time Limit Exceeded (>2000 ms) ``` В этом примере: - Тесты 1-2 пройдены - Тест 3 — неверный ответ (ошибка в логике) - Тест 4 — превышено время (алгоритм слишком медленный) --- ## Статусы проверки После отправки кода вы увидите статусы: | Статус | Описание | |--------|----------| | **В очереди** | Код ожидает проверки | | **Компиляция** | Код компилируется | | **Выполнение** | Код запускается на тестах | | **Завершено** | Все тесты проверены | | **Ошибка** | Произошла системная ошибка | > **Примечание**: Обычно проверка занимает 5-30 секунд. Статус обновляется автоматически. --- ## История отправок ### Где смотреть В разделе задачи есть панель **«История»** или **«Мои отправки»**, где видны: - Все ваши запуски (Run) - Сохранённые решения (Submit) - Статус и результат каждой отправки - Время отправки ### Что видно для каждой отправки | Поле | Описание | |------|----------| | **Дата/время** | Когда отправлено | | **Язык** | На каком языке написано | | **Статус** | AC, WA, TLE и т.д. | | **Результат** | Процент пройденных тестов | | **Время** | Среднее время выполнения | | **Память** | Среднее использование памяти | ### Лимит отправок В некоторых соревнованиях есть лимит на количество отправок: | Тип лимита | Описание | Пример | |------------|----------|--------| | **За всё время** | Общее количество | Максимум 50 отправок | | **В сутки** | Сбрасывается каждый день | 10 отправок в день | Если лимит исчерпан, вы увидите сообщение: ``` Лимит запусков исчерпан (10 сегодня) Осталось попыток: 0 ``` --- ## Система оценивания ### Стандартный режим Все тесты пройдены = полные баллы. Иначе = 0 баллов. ``` Задача: 100 баллов Пройдено: 10/10 тестов Результат: 100 баллов ``` ### Частичные баллы Баллы за каждый пройденный тест: ``` Задача: 100 баллов, 10 тестов Пройдено: 7/10 тестов Результат: 70 баллов ``` ### Режим лучшего результата Если включён **Best Score Mode**: - Учитывается лучший результат из всех Submit - Можно улучшать решение без риска потерять баллы --- ## Пример задачи ### Условие > Дано число N. Выведите сумму чисел от 1 до N. ### Ограничения - Время: 1 секунда - Память: 256 МБ - 1 ≤ N ≤ 10^9 ### Формат входных данных ``` Одно целое число N ``` ### Формат выходных данных ``` Одно число — сумма от 1 до N ``` ### Примеры | Вход | Выход | |------|-------| | 5 | 15 | | 10 | 55 | ### Анализ - N до 10^9 — цикл будет работать 10^9 итераций - 1 секунда — примерно 10^8 операций - **Вывод**: наивное решение не подойдёт ### Решение ```python n = int(input()) # Формула суммы арифметической прогрессии print(n * (n + 1) // 2) ``` --- ## Работа с вводом/выводом ### Python ```python # Одно число n = int(input()) # Несколько чисел в строке a, b, c = map(int, input().split()) # Массив чисел arr = list(map(int, input().split())) # Несколько строк lines = [] for _ in range(n): lines.append(input()) # Вывод print(result) print(a, b, c) # через пробелы print(*arr) # массив через пробелы ``` ### C++ ```cpp #include <iostream> #include <vector> using namespace std; int main() { // Ускорение ввода/вывода (обязательно!) ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } cout << result << "\n"; return 0; } ``` ### Java ```java import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(System.out); int n = Integer.parseInt(br.readLine()); String[] parts = br.readLine().split(" "); out.println(result); out.flush(); } } ``` ### JavaScript (Node.js) ```javascript const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const lines = []; rl.on('line', (line) => lines.push(line)); rl.on('close', () => { const n = parseInt(lines[0]); const arr = lines[1].split(' ').map(Number); console.log(result); }); ``` --- ## Типичные ошибки и решения ### Wrong Answer (WA) **Возможные причины:** 1. Ошибка в логике алгоритма 2. Не обработаны граничные случаи 3. Переполнение типа данных 4. Неверный формат вывода **Как исправить:** ``` 1. Проверьте решение на примерах из условия 2. Придумайте свои тесты (граничные случаи) 3. Проверьте N=0, N=1, максимальные значения 4. Убедитесь, что формат вывода точный ``` ### Time Limit Exceeded (TLE) **Возможные причины:** 1. Алгоритм слишком медленный 2. Бесконечный цикл 3. Неоптимальные структуры данных **Как оценить сложность:** | N | Допустимая сложность | |---|---------------------| | 10^3 | O(N^2), O(N^2 log N) | | 10^5 | O(N log N), O(N) | | 10^6 | O(N), O(N log N) | | 10^9 | O(log N), O(1) | ### Memory Limit Exceeded (MLE) **Возможные причины:** 1. Слишком большие массивы 2. Рекурсия без мемоизации 3. Утечки памяти **Как исправить:** - Используйте итеративные алгоритмы вместо рекурсии - Не храните больше данных, чем нужно - Используйте генераторы (Python) или итераторы ### Runtime Error (RE) **Возможные причины:** 1. Деление на ноль 2. Выход за границы массива 3. Переполнение стека (глубокая рекурсия) 4. Обращение к null/None **Как исправить:** ```python # Проверяйте границы if i >= 0 and i < len(arr): print(arr[i]) # Проверяйте деление if b != 0: result = a / b ``` --- ## Советы от профессионалов ### Читайте условие внимательно - **Диапазоны**: 1 ≤ N ≤ 10^5 или 1 ≤ N ≤ 10^9 — разница критическая - **«≤» vs «<»**: N ≤ 10 означает N может быть 10 - **Формат**: пробелы, переносы строк — всё важно ### Начинайте с простого 1. Напишите наивное решение 2. Проверьте на примерах 3. Отправьте (Run), посмотрите результат 4. Оптимизируйте только если нужно ### Тестируйте локально Перед отправкой: 1. Проверьте на примерах из условия 2. Придумайте свои тесты 3. Проверьте граничные случаи (0, 1, максимум) ### Отладка ```python # Добавьте отладочный вывод print(f"DEBUG: n={n}, arr={arr}", file=sys.stderr) # Не забудьте убрать перед Submit! ``` --- ## Частые вопросы **В: Почему мой код работает локально, но не проходит на сервере?** О: Возможные причины: - Разные версии языка/библиотек - Другой формат переносов строк - Превышение лимитов (локально вы этого не заметите) **В: Сколько попыток на отправку?** О: Зависит от конкурса. Смотрите в интерфейсе задачи — показывается «Осталось попыток: X». **В: Видно ли, на каком тесте упало решение?** О: Видно номер теста и вердикт. Содержимое скрытых тестов не показывается. **В: Можно ли использовать внешние библиотеки?** О: Обычно только стандартные библиотеки языка. NumPy, pandas и подобные — обычно нет. **В: Как узнать, почему TLE?** О: Оцените сложность вашего алгоритма. Если O(N^2) при N=10^5 — это примерно 10^10 операций, что слишком много. **В: Что делать, если все примеры проходят, но WA на скрытых?** О: Придумайте свои тесты: граничные случаи, большие данные, отрицательные числа (если разрешены). --- ## Связанные статьи - [Обзор типов задач](/docs/participant/tasks/overview) - [TEST: Тестовые задачи](/docs/participant/tasks/test-tasks) - [FILE: Загрузка файлов](/docs/participant/tasks/file-tasks) - [Как работают треки](/docs/participant/tasks/tracks-overview)
Последнее обновление: 20.08.2026
К оглавлению