Пример работы с системой ACMP
Рассмотрим процесс решения на примере задачи №274 «Дружные числа».
Логика решения достаточно проста: для каждого из проверяемых чисел опишем логический массив, в котором i-ый элемент равен 1, если число содержит цифру i. Два числа являются дружными тогда и только тогда, когда соответствующие им массивы поэлементно равны.
Ниже показаны функции для определения логических массивов и их сравнения.
void getDigits(int n, bool dn[]) { while (n) { dn[n % 10] = true; n /= 10; } } |
bool compareDigits(bool da[], bool db[]) { for (int i = 0; i < 10; i++) if (da[i] != db[i]) return false; return true; } |
Основная функция может иметь следующий вид:
int main() { int testsCnt, a, b; bool da[10], db[10]; scanf("%d", &testsCnt); for (int i = 0; i < testsCnt; i++) { scanf("%d%d", &a, &b); getDigits(a, da); getDigits(b, db); printf("%s\n", compareDigits(da, db) ? "YES" : "NO"); } return 0; }
Когда решение составлено, его следует отправить на проверку. Для этого следует выбрать текстовый файл с кодом решения (не исполняемый файл!) в форме «Сдать задачу» и нажать кнопку «Отправить» (рис. 1). Следует иметь в виду, что система ACMP определяет компилятор, требуемый для решения, по расширению предоставленного файла (*.c и *.cpp для C/C++, *.pas и *.dpr для Pascal, *.java для Java).
После отправки решения становится доступен результат его проверки (рис. 2). В нашем случае получен вердикт «Compilation Error» (ошибка компиляции). При данном ответе системы автор может просмотреть сообщения компилятора, перейдя по ссылке с ID решения. В показанном примере (рис. 3) компилятор сигнализирует о недоступности функций scanf и printf, так как не подключен заголовочный файл <stdio.h>.
Добавим в решение строку
#include <stdio.h>
и отправим его заново (рис. 4).
Теперь система выдаёт ответ «Time Limit Exceeded» (превышен предел времени выполнения) на первом тесте. Причиной данной ошибки является то, что система ACMP предполагает файловый ввод-вывод для задач, тогда как решение использует стандартную настройку (ввод с клавиатуры, вывод на монитор); при этом программа всё отведённое время находится в состоянии ожидания ввода, а затем снимается проверяющей системой как медленно работающая.
Примеры простого перенаправления ввода-вывода для используемых в системе языков программирования приведены на странице Новичкам.Используем вариант для C++: добавим в функцию main строки
freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
Повторная отправка решения (рис. 5) приводит к вердикту «Wrong Answer» (неверный ответ). В большинстве задач (но не во всех) начальные тесты совпадают с тестами из условия. Трассировка решения на втором тесте позволяет выяснить причину ошибки: входные данные могут содержать несколько тестовых случаев, и перед рассмотрением каждого из них логические массивы требуется очищать.
Добавим очистку в цикл for в основной функции:
for (int j = 0; j < 10; j++) da[j] = db[j] = false;
С данной модификацией решение проходит все тесты (рис. 6, 7).