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: Изучите условие
- Прочитайте задачу полностью — не пропускайте ничего
- Разберите примеры — они показывают формат и логику
- Обратите внимание на ограничения:
- Диапазон входных данных (влияет на выбор алгоритма)
- Лимит времени (влияет на сложность алгоритма)
- Лимит памяти (влияет на структуры данных)
Шаг 2: Напишите решение
- Выберите язык из выпадающего списка
- Напишите код в редакторе (Monaco Editor с подсветкой синтаксиса)
- Используйте шаблон — некоторые задачи имеют начальный код
Шаг 3: Запустите (Run)
Кнопка «Run» (или «Запустить») отправляет код на проверку:
- Код компилируется (для компилируемых языков)
- Запускается на всех тестах
- Результаты показываются в панели результатов
Важно: Run — это проверка без сохранения. Можно запускать многократно для отладки.
Шаг 4: Анализируйте результаты
После запуска вы видите:
| Информация | Описание |
|---|---|
| Статус | Общий результат (Accepted, Wrong Answer, и т.д.) |
| Пройдено тестов | Например, 8 из 10 |
| Время | Среднее время выполнения |
| Память | Средний объём памяти |
| Детали по тестам | Для публичных тестов — ваш вывод |
Шаг 5: Сохраните решение (Submit)
Когда результат вас устраивает:
- Нажмите «Submit» (или «Сохранить решение»)
- Выберите, какой запуск сохранить (обычно последний)
- Решение фиксируется для подсчёта баллов
Важно: Submit сохраняет ваш результат. В некоторых соревнованиях учитывается лучший результат из всех Submit.
Run vs Submit: в чём разница?
| Действие | Run (Запустить) | Submit (Сохранить) |
|---|---|---|
| Что делает | Проверяет код на тестах | Фиксирует результат |
| Влияет на баллы | Нет | Да |
| Можно отменить | Да, просто запустите новый | Зависит от настроек |
| Когда использовать | Для отладки и проверки | Когда уверены в решении |
Сценарий работы
1. Написали решение
2. Run → увидели WA на тесте 3
3. Исправили ошибку
4. Run → все тесты пройдены
5. Submit → решение сохранено, баллы начислены
Вердикты проверки
Успешные вердикты
| Вердикт | Сокращение | Значение |
|---|---|---|
| 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 операций
- Вывод: наивное решение не подойдёт
Решение
n = int(input())
# Формула суммы арифметической прогрессии
print(n * (n + 1) // 2)
Работа с вводом/выводом
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++
#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
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)
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. Проверьте N=0, N=1, максимальные значения
4. Убедитесь, что формат вывода точный
Time Limit Exceeded (TLE)
Возможные причины:
- Алгоритм слишком медленный
- Бесконечный цикл
- Неоптимальные структуры данных
Как оценить сложность:
| 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)
Возможные причины:
- Слишком большие массивы
- Рекурсия без мемоизации
- Утечки памяти
Как исправить:
- Используйте итеративные алгоритмы вместо рекурсии
- Не храните больше данных, чем нужно
- Используйте генераторы (Python) или итераторы
Runtime Error (RE)
Возможные причины:
- Деление на ноль
- Выход за границы массива
- Переполнение стека (глубокая рекурсия)
- Обращение к null/None
Как исправить:
# Проверяйте границы
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
- Формат: пробелы, переносы строк — всё важно
Начинайте с простого
- Напишите наивное решение
- Проверьте на примерах
- Отправьте (Run), посмотрите результат
- Оптимизируйте только если нужно
Тестируйте локально
Перед отправкой:
- Проверьте на примерах из условия
- Придумайте свои тесты
- Проверьте граничные случаи (0, 1, максимум)
Отладка
# Добавьте отладочный вывод
print(f"DEBUG: n={n}, arr={arr}", file=sys.stderr)
# Не забудьте убрать перед Submit!
Частые вопросы
В: Почему мой код работает локально, но не проходит на сервере?
О: Возможные причины:
- Разные версии языка/библиотек
- Другой формат переносов строк
- Превышение лимитов (локально вы этого не заметите)
В: Сколько попыток на отправку?
О: Зависит от конкурса. Смотрите в интерфейсе задачи — показывается «Осталось попыток: X».
В: Видно ли, на каком тесте упало решение?
О: Видно номер теста и вердикт. Содержимое скрытых тестов не показывается.
В: Можно ли использовать внешние библиотеки?
О: Обычно только стандартные библиотеки языка. NumPy, pandas и подобные — обычно нет.
В: Как узнать, почему TLE?
О: Оцените сложность вашего алгоритма. Если O(N^2) при N=10^5 — это примерно 10^10 операций, что слишком много.
В: Что делать, если все примеры проходят, но WA на скрытых?
О: Придумайте свои тесты: граничные случаи, большие данные, отрицательные числа (если разрешены).