Пример работы с системой 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. Отправка файла
2. Получение вердикта проверки (CE)
3. Просмотр сообщений компилятора
4. Повторная попытка отправки (TLE)
5. Третья попытка отправки (WA)
6. Успешная попытка отправки
7. Код корректного решения

Когда решение составлено, его следует отправить на проверку. Для этого следует выбрать текстовый файл с кодом решения (не исполняемый файл!) в форме «Сдать задачу» и нажать кнопку «Отправить» (рис. 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).