Что такое ACM-задача

June 14, 2017

На примере задачи Эния разберём, что вообще представляет из себя ACM-задача. Отметим, что решением задачи является программа на некотором языке программирования, и проверяются решения автоматически. Ниже мы обсудим это подробнее, а пока стоит это просто запомнить, потому что на этом основана некоторая специфика задач по сравнению с математическими олимпиадами, например.

Условие

Основная часть

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

В задаче Эния математическая формулировка — Посчитайте сумму удвоенных площадей $N$ прямоугольников $A \times B$. Легенда — Найдите необходимую для обработки панелей массу сульфида.

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

Здесь чётко специфицируется, что и в каком порядке будет подано на вход программы.

В задаче Эния на вход подается три целых числа ($N$, $A$, $B$), записанных в одной строке через пробел.

Ограничения на входные данные

Это какие-то условия, которые точно будут выполнены на всех входных данных.

Типичные ограничения:

  • Диапазон значений для числовых параметров: $1 \le N \le 100$
  • Ограничение на длину строки: Длина строки не превосходит $100000$
  • Ограничение на символы строки: Строка состоит из маленьких латинских букв
  • Выполнение какого-то специального свойства:
    • Граф является деревом
    • В графе нет петель и кратных рёбер
    • Степени всех вершин не превосходят $5$
    • Граф является планарным
    • Матрица является симметричной ($a_{ij} = a_{ji}$)
    • Строка лексикографически меньше всех своих собственных суффиксов
    • Решение существует
    • Решение существует и единственно
    • Ответ не превосходит $15$

Обычно разделы “входные данные” и “ограничения на входные данные” объединяют, но есть исключения.

В задаче Эния все числа на входе лежат в диапазоне $[1;100]$

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

Здесь чётко специфицируется, что и в каком порядке должно выдать решение.

В задаче Эния нужно выдать одно число: массу сульфида.

Ограничения по памяти и по времени

Решение будет запущено в некоторой песочнице, и ему будет выделено определённое количество времени и памяти. Если решение будет использовать больше времени или памяти, то оно будет признано неверным. Соответствующие ограничения времени и памяти указываются в условии.

В задаче Эния ограничение по времени составляет 1 секунду, ограничение по памяти — 64 МБ.

Примеры (сэмплы)

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

В задаче Эния тест “5 2 3” является валидным, и правильный ответ на него — 60.

Решение

Решение задачи — это программа на одном из поддерживаемых на соревновании языке программирования. Стандартом де-факто является поддержка C++ и Java, многие участники используют Python, остальные языки используются намного реже.

Пример решения задачи Эния на C++:

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main()
{
	int N, A, B;
	cin >> N >> A >> B;
	cout << 2 * N * A * B << endl;
	return 0;
}

Есть исключения: на некоторых соревнованиях, в том числе очень престижных Google Code Jam и Facebook Hacker Cup, участнику высылается тест, а он должен прислать ответ на этот тест. Впрочем, обычно вся разница в том, что тестирование происходит на компьютере участника, и ограничение по памяти примерно равно объёму оперативной памяти.

Проверка решения

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

И это очень важная специфика соревнований по программированию: чтобы сдать (решить) задачу, не нужно уметь доказывать своё решение. Более того, решение может быть неверным; необходимо и достаточно, чтобы оно проходило все тесты из заранее подготовленного набора. Конечно, обычно тесты участникам неизвестны, однако сам факт того, что их конечное количество, говорит о том, что покрыть все возможные случаи обычно невозможно. Количество тестов обычно не сильно больше 100, и почти наверное не больше 500.

Проверяющая программа (чекер)

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

Типичные вердикты

  • Accepted (AC/OK): Решение прошло все тесты
  • Compilation Error (CE): Компиляция завершилась с ошибкой
  • Wrong answer (WA T): Решение прошло все тесты с номерами строго меньше T и выдало неправильный ответ на тесте номер T
    • Неверное решение
    • Ошибка в программе
  • Time Limit Exceeded (TLE T): Решение прошло все тесты с номерами строго меньше T и превысило ограничение по времени на тесте номер T
    • Неоптимальное решение
    • Ошибка в программе, приводящая к серьёзному замедлению или бесконечному циклу
  • Memory Limit Exceeded (MLE T): Решение прошло все тесты с номерами строго меньше T и превысило ограничение по памяти на тесте номер T
    • Неоптимальное решение
    • Ошибка в программе, приводящая к серьёзному увеличению используемой памяти или бесконечному циклу, в котором выделяется память
  • Runtime Error (RTE T): Решение прошло все тесты с номерами строго меньше T и завершилось с ошибкой на тесте номер T
    • Деление на 0
    • Выход за границы массива в Java
    • Невалидная работа с указателями
    • Переполнение стека
    • Непойманное исключение

Некоторые тестирующие системы не сообщают номер теста, который решение не прошло.