Пример работы с системой ACMP: различия между версиями
Ctrlalt (обсуждение | вклад) (Новая страница: «Рассмотрим процесс решения на примере [http://acmp.ru/index.asp?main=task&id_task=274 задачи №274 «Дружные …») |
Ctrlalt (обсуждение | вклад) мНет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 26: | Строка 26: | ||
int main() { | int main() { | ||
int | int testsCnt, a, b; | ||
bool da[10], db[10]; | bool da[10], db[10]; | ||
scanf("%d", &testsCnt); | scanf("%d", &testsCnt); | ||
for (int i = 0; i < testsCnt; i++) { | for (int i = 0; i < testsCnt; i++) { | ||
scanf("%d%d", &a, &b); | scanf("%d%d", &a, &b); | ||
getDigits(a, | getDigits(a, da); | ||
getDigits(b, | getDigits(b, db); | ||
printf("%s\n", compareDigits(da, db) ? "YES" : "NO"); | printf("%s\n", compareDigits(da, db) ? "YES" : "NO"); | ||
} | } | ||
return 0; | return 0; | ||
} | } | ||
{| align="center" | |||
|+ '''Отправка решения на проверку и просмотр результатов''' | |||
| [[Файл:acmp_submit_1.png|thumb|180px|1. Отправка файла]] | |||
| [[Файл:acmp_submit_2.png|thumb|180px|2. Получение вердикта проверки (CE)]] | |||
| [[Файл:acmp_submit_3.png|thumb|180px|3. Просмотр сообщений компилятора]] | |||
| [[Файл:acmp_submit_4.png|thumb|180px|4. Повторная попытка отправки (TLE)]] | |||
|- | |||
| [[Файл:acmp_submit_5.png|thumb|180px|5. Третья попытка отправки (WA)]] | |||
| [[Файл:acmp_submit_6.png|thumb|180px|6. Успешная попытка отправки]] | |||
| [[Файл:acmp_submit_7.png|thumb|180px|7. Код корректного решения]] | |||
|} | |||
Когда решение составлено, его следует отправить на проверку. Для этого следует выбрать '''текстовый файл''' с кодом решения (не исполняемый файл!) в форме «Сдать задачу» и нажать кнопку «Отправить» (рис. 1). Следует иметь в виду, что система ACMP определяет компилятор, требуемый для решения, по расширению предоставленного файла (<tt>*.c</tt> и <tt>*.cpp</tt> для C/C++, <tt>*.pas</tt> и <tt>*.dpr</tt> для Pascal, <tt>*.java</tt> для Java). | |||
После отправки решения становится доступен результат его проверки (рис. 2). В нашем случае получен вердикт «Compilation Error» (ошибка компиляции). При данном ответе системы автор может просмотреть сообщения компилятора, перейдя по ссылке с ID решения. В показанном примере (рис. 3) компилятор сигнализирует о недоступности функций <tt>scanf</tt> и <tt>printf</tt>, так как не подключен заголовочный файл <tt><stdio.h></tt>. | |||
Добавим в решение строку | |||
#include <stdio.h> | |||
и отправим его заново (рис. 4). | |||
Теперь система выдаёт ответ «Time Limit Exceeded» (превышен предел времени выполнения) на первом тесте. Причиной данной ошибки является то, что система ACMP предполагает '''файловый ввод-вывод''' для задач, тогда как решение использует стандартную настройку (ввод с клавиатуры, вывод на монитор); при этом программа всё отведённое время находится в состоянии ожидания ввода, а затем снимается проверяющей системой как медленно работающая. | |||
Примеры простого перенаправления ввода-вывода для используемых в системе языков программирования приведены на странице [http://acmp.ru/article.asp?id_text=118 Новичкам].Используем вариант для C++: добавим в функцию <tt>main</tt> строки | |||
freopen("input.txt", "r", stdin); | |||
freopen("output.txt", "w", stdout); | |||
Повторная отправка решения (рис. 5) приводит к вердикту «Wrong Answer» (неверный ответ). В большинстве задач (но не во всех) начальные тесты совпадают с тестами из условия. Трассировка решения на втором тесте позволяет выяснить причину ошибки: входные данные могут содержать несколько тестовых случаев, и перед рассмотрением каждого из них логические массивы требуется очищать. | |||
Добавим очистку в цикл <tt>for</tt> в основной функции: | |||
for (int j = 0; j < 10; j++) | |||
da[j] = db[j] = false; | |||
С данной модификацией решение проходит все тесты (рис. 6, 7). | |||
[[Категория: Летняя практика ИВТ УлГТУ — 2013]] | [[Категория: Летняя практика ИВТ УлГТУ — 2013]] |
Текущая версия от 12:17, 23 июля 2013
Рассмотрим процесс решения на примере задачи №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).