Задача про очередь в Python
Задали лабораторную в институте по написанию очереди в python, задачу решил, загрузил на платформу (ejudge), но вот на 13 тесте выдало ошибку «Превышено время работы программы >3 сек», в чем проблема вообще понять не могу. Вот условие:
Задача про очередь
Реализуйте очередь, используя только массив. Ввод и вывод данных
осуществляется через файлы. Имена входного и выходного файлов задаются
через аргументы командной строки (первый и второй соответственно).
Формат входных данных Во входном файле задаётся последовательность
команд. Пустые строки игнорируются. Первая строка всегда содержит
«set_size N», где N — максимальный размер очереди, целое число. Каждая
последующая строка содержит ровно одну команду: push X, pop или print,
где X — произвольная строка без пробелов. Формат результата Команда
print выводит содержимое очередь (от головы к хвосту) одной строкой,
значения разделяются пробелами. Если очередь пуста, то выводится
«empty». В случае переполнения очереди выводится «overflow». Команда
pop выводит элемент или «underflow», если очередь пуста. Память под
очередь должна быть выделена не более одного раза, при вызове команды
«set_size». В любой непонятной ситуации результатом работы любой
команды будет «error».
import sys
class Queue:
def __init__(self, size):
self.queue = []
self.size = size
def push(self, value):
if len(self.queue) < self.size:
return self.queue.append(value)
else:
return 'overflow'
def pop(self):
if self.queue:
first = self.queue[0]
del self.queue[0]
return first
else:
return 'underflow'
def print(self):
global text
if len(self.queue) > 0:
for i, element in enumerate(self.queue):
if i + 1 < len(self.queue):
text += element + ' '
else:
text += element
else:
text += 'empty'
text += 'n'
return
names = []
if __name__ == "__main__":
for args in sys.argv[1:]:
names.append(args)
in_file = names[0]
out_file = names[1]
f = open(in_file)
defined = False
text = ''
for i in f:
com = i.strip('n')
if com.split(' ')[0] == 'set_size' and not defined:
size = int(com.split(' ')[1])
q = Queue(size)
defined = True
elif com == 'pop' and defined:
text += q.pop() + 'n'
elif com.split(' ')[0] == 'push' and len(com.split(' ')) == 2 and defined:
value = com.split(' ')[1]
pt = q.push(value)
if pt is not None:
text += pt + 'n'
elif com == 'print' and defined:
q.print()
elif com == '':
continue
else:
text += 'errorn'
f.close()
f = open(out_file, 'w')
f.write(text)
f.close()
Окно выполнения тестов, на 13, почему то выдало ошибку
Для понятности залил на этот гит два файла, «input» — файл, который платформа тестирования подает на вход, а «output», это правильный ответ на задачу. Мою программу принудительно остановили (из-за превышения времени), и она ничего не выдала
https://github.com/RoyalGoose/testrepos
В чем может быть проблема? Как я могу исправить код, чтобы он работал быстрее и прошел бы этот тест?
31.12.2019GBlog, Конкурентное программирование, Технические Советы
Многие программисты всегда утверждают, что проблемы в конкурентном программировании всегда заканчиваются TLE (Time Limit Exceed). Основная проблема этой ошибки заключается в том, что она не позволит вам узнать, достигнет ли ваше решение правильного решения или нет!
Почему TLE приходит?
- Ограничения онлайн-судьи: TLE имеет место из-за того, что у онлайн-судьи есть некоторые ограничения, которые не позволяют обрабатывать инструкцию после определенного срока, установленного постановщиком задач (обычно 1 секунда).
- Конфигурация сервера . Точное время, затрачиваемое кодом, зависит от скорости сервера, архитектуры сервера, ОС и, конечно, от сложности алгоритма. Поэтому разные серверы, такие как практика, codechef, SPOJ и т. Д., Могут иметь разную скорость выполнения. Оценив максимальное значение N (N — это общее количество инструкций всего вашего кода), вы можете приблизительно оценить, произойдет ли TLE или нет в течение 1 секунды.
MAX value of N Time complexity 10^8 O(N) Border case 10^7 O(N) Might be accepted 10^6 O(N) Perfect 10^5 O(N * logN) 10^3 O(N ^ 2) 10^2 O(N ^ 3) 10^9 O(logN) or Sqrt(N)
Таким образом, проанализировав эту диаграмму, вы можете приблизительно оценить сложность времени и сделать свой код в пределах верхнего предела.
- Метод чтения ввода и записи вывода слишком медленный: иногда методы, используемые программистом для ввода ввода, могут вызывать TLE.
Ошибки лимита времени OverCome
- Измените методы ввода-вывода: вы должны выбрать правильные функции ввода-вывода и структуру данных, которые помогут вам в оптимизации.
- В C ++ не используйте cin / cout — используйте scanf и printf.
- В Java не используйте сканер — используйте вместо него BufferedReader.
- В Python вы можете попробовать ускорить свои решения, добавив следующие две строки в начало вашего файла:
import
psyco
psyco.full()
- Границы циклов могут быть уменьшены: внимательно прочитайте границы входных данных перед написанием вашей программы и попытайтесь выяснить, какие входные данные приведут к тому, что ваша программа будет работать медленнее. Например, если проблема говорит вам, что N <= 100000 или N <= 1000000, и ваша программа имеет вложенные циклы, каждый из которых достигает N, ваша программа никогда не будет достаточно быстрой.
- Оптимизируйте свой алгоритм. Если после всего этого ничего не сработает, попробуйте изменить алгоритм или подход, который вы используете для решения своей проблемы. Как правило, внутренние тестовые примеры разработаны таким образом, что вы сможете очистить их все, только если выберете наилучший из возможных алгоритмов.
- Посмотрите на предложенные предложения: хотя это должен быть последний шаг, но вы должны посмотреть на комментарии, приведенные ниже, о любой проблеме, в которой другие программисты могли бы дать подсказку о том, как решить проблему лучше и эффективнее. И даже когда вы преодолеваете TLE, попробуйте более исчерпывающие и угловые контрольные примеры для вашей программы, чтобы проверить производительность.
В конечном счете, с опытом вы обязательно узнаете, что делать, а что не избегать TLE. Чем больше вы кодируете, тем больше вы узнаете о том, как конкурировать с TLE.
Практика сейчас
Эта статья предоставлена Shubham Bansal . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Проблемы кибербезопасности в цифровом маркетинге — предпримите эти шаги, чтобы преодолеть
- Найдите время, которое является палиндромным и наступает по истечении заданного времени
- Что делать во время неправильного ответа (WA)?
- Лучшие программисты в мире всех времен
- функция time.h localtime () в C с примерами
- Найти расположение очереди в данное время
- Найдите минимальное время, после которого можно обмениваться заметками
- Расширенный алгоритм Мо с ≈ O (1) сложностью по времени
- Несколько советов по экономии времени для пользователей Linux
- Как найти время, затрачиваемое командой / программой на Linux Shell?
- Теория игр в сбалансированной троичной системе счисления | (Перемещение 3k шагов за раз)
- Динамическое Программирование | Подстановочный шаблон соответствия | Линейное время и постоянное пространство
- Sqrt (или квадратный корень) разложение | Установите 2 (LCA дерева в O (sqrt (высота)) время)
- Количество способов упорядочить K различных объектов, принимая N объектов одновременно
Как преодолеть превышение лимита времени (TLE)?
0.00 (0%) 0 votes
Задали лабораторную в институте по написанию очереди в python, задачу решил, загрузил на платформу (ejudge), но вот на 13 тесте выдало ошибку «Превышено время работы программы >3 сек», в чем проблема вообще понять не могу. Вот условие:
Задача про очередь Реализуйте очередь, используя только массив. Ввод и вывод данных осуществляется через файлы. Имена входного и выходного файлов задаются через аргументы командной строки (первый и второй соответственно). Формат входных данных Во входном файле задаётся последовательность команд. Пустые строки игнорируются. Первая строка всегда содержит «set_size N», где N — максимальный размер очереди, целое число. Каждая последующая строка содержит ровно одну команду: push X, pop или print, где X — произвольная строка без пробелов. Формат результата Команда print выводит содержимое очередь (от головы к хвосту) одной строкой, значения разделяются пробелами. Если очередь пуста, то выводится «empty». В случае переполнения очереди выводится «overflow». Команда pop выводит элемент или «underflow», если очередь пуста. Память под очередь должна быть выделена не более одного раза, при вызове команды «set_size». В любой непонятной ситуации результатом работы любой команды будет «error».
Окно выполнения тестов, на 13, почему то выдало ошибку
Для понятности залил на этот гит два файла, «input» — файл, который платформа тестирования подает на вход, а «output», это правильный ответ на задачу. Мою программу принудительно остановили (из-за превышения времени), и она ничего не выдала https://github.com/RoyalGoose/testrepos
В чем может быть проблема? Как я могу исправить код, чтобы он работал быстрее и прошел бы этот тест?
Time limit exceeded python что это
В нашем архиве вы найдёте множество задач с соревнований по спортивному программированию различной сложности. С помощью автоматической проверяющей системы вы сможете мгновенно проверить свое решение. В этом разделе описана работа с проверяющей системой шаг за шагом.
1. Выбираем задачу
Чтобы увидеть список задач перейдите по ссылке Архив задач, затем выберите том или рубрику. Выберите интересующую вас задачу. Для тех, кто здесь впервые, рекомендуем начать с задач 1000. A+B Problem и 1001. Обратный корень. После того как определитесь с выбором задачи, приступайте к ее решению.
2. Решаем задачу и отправляем решение на проверку
Решением задачи является исходный код программы, написанный на одном из доступных языков программирования.
Пример решения задачи 1000. A+B Problem, в которой требуется считать два целых числа и вывести их сумму (на языке Паскаль):
Чтобы автоматическая проверяющая система смогла протестировать ваше решение, оно должно отвечать следующим требованиям.
- Программа должна являться консольным приложением.
- Входные данные подаются программе в стандартном потоке ввода (ввод с клавиатуры). Программа должна выводить ответ в стандартный поток вывода (вывод на экран).
- Программа должна выводить только те данные, которые требует условие задачи. Выводить приглашение для ввода («Введите N:») не нужно. Также не нужно ожидать нажатия клавиши в конце работы программы.
Входные данные в тестах всегда удовлетворяют ограничениям, описанным в условиях задач. Проверять эти ограничения в своих решениях не требуется.
В решениях задач запрещается:
- работа с любыми файлами;
- выполнение внешних программ и создание новых процессов;
- работа с элементами графического интерфейса (окнами, диалогами и т.д.);
- работа с внешними устройствами (принтером, звуковой картой и т.д.);
- использование сетевых средств.
О том, как следует использовать конкретные языки программирования, читайте в соответствующих разделах:
- Как писать решения на C/C++
- Как писать решения на Pascal
- Как писать решения на Java
- Как писать решения на C#
- Как писать решения на Go
- Как писать решения на Python
- Как писать решения на Ruby
- Как писать решения на Haskell
- Как писать решения на Scala
- Как писать решения на Rust
- Как писать решения на Kotlin
Как только вы написали решение задачи и проверили его на тестах из условия, можете отправить его на проверку. Для отправки решения вам потребуется JUDGE_ID, полученный при регистрации на сайте.
3. Система проверяет решение
После отправки решения вы попадете на страницу Состояние проверки, где находится список всех последних решений. Среди них должно быть и ваше.
Решение проверяется автоматически последовательным запуском на наборе тестов, который недоступен авторам решений и является одинаковым для всех решений данной задачи.
Решение засчитывается в том случае, если оно выдает верные ответы на все тесты. Первыми тестами в наборе зачастую являются тесты из условия задачи. Если на одном из тестов верный ответ получен не был, то проверка прекращается, а номер теста и тип ошибки выводится в таблице результатов проверки. В некоторых задачах правильный ответ может быть неоднозначен. В этом случае ответ будет проверен специальной проверяющей программой.
Для каждой задачи определены максимальное время выполнения и объем доступной памяти для одного теста. В случае превышения программой лимита времени или памяти, тест считается непройденным. Вывод программы в этом случае не проверяется. В некоторых задачах ограничения по времени и памяти могут быть достаточно жесткими. Написание решений на всех доступных языках для таких задач может оказаться достаточно трудным или даже невозможным.
При подсчете времени работы решения учитывается только процессорное время, затраченное программой. Для подсчета памяти берется максимальный объем памяти, который использовался процессом в течение его работы (максимальный рабочий набор, peak working set). Далее из этого значения вычитается константа, равная минимальному объему памяти, который нужен программам на выбранном языке (обычно от 1 до 15 МБ).
Результатом проверки решения может быть один из следующих вердиктов:
- Accepted. Решение засчитано как правильное.
- Compilation error. Компиляция программы завершилась с ошибкой. Отчет компилятора в течение 15 минут будет доступен по ссылке на странице Состояние проверки. Возможные причины: синтаксическая ошибка; неправильно указан язык.
- Wrong answer. Ответ программы неверен. В этом случае сообщается только номер теста. Входные данные теста не предоставляются, т.к. причины ошибки должны быть выявлены автором решения самостоятельно. Возможные причины: ошибка в программе; неверный алгоритм; программа выводит ответ в файл.
- Time limit exceeded. Программа превысила установленное ограничение по времени. Работа решения будет прервана, как только истечет это время. Возможные причины: бесконечный цикл; неэффективное решение.
- Memory limit exceeded. Программа превысила установленное ограничение по памяти. Работа решения будет прервана, как только превышено это ограничение. Возможные причины: утечка памяти; неэффективное решение.
- Output limit exceeded. Программа превысила ограничение на размер выходных данных. Данное ограничение устанавливается с большим запасом и, как правило, не указывается в условиях задач. Возможные причины: бесконечный цикл; ошибка в программе.
- Idleness limit exceeded. Программа простаивала в течение длительного промежутка времени. Возможные причины: ожидание нажатия клавиши в конце программы; чтение входных данных, когда они уже прочитаны до конца.
- Runtime error. Программа аварийно завершила работу. Возможные причины: ненулевой код возврата (ошибка «non-zero exit code»); деление на ноль (ошибка «division by zero»); бесконечная рекурсия (ошибка «stack overflow»); недостаточный размер массивов или обращение по недоступному адресу в памяти (ошибка «access violation»). Чтобы избежать переполнения стека, используйте специальные директивы, которые приведены в разделах, посвященных конкретным языкам программирования.
- Restricted function. Программа попыталась совершить небезопасную для проверяющей системы операцию. Возможные причины: чтение из файла, обращение к сетевому ресурсу.
Пример: если вы получили вердикт Wrong answer на тесте №3, то это означает, что ваше решение успешно прошло тесты №1 и №2, а на тесте №3 вывело неверный ответ. Если вы исправили ошибку, отправили решение на проверку снова и получили вердикт Time limit exceeded на тесте №10, то это означает, что исправленная ошибка действительно проявлялась на тесте №3. Теперь решение успешно проходит тесты с №1 по №9, а на тесте №10 работает дольше установленного ограничения. При этом неизвестно, был бы ответ на этом тесте правильным в случае, если бы решение уложилось в ограничение по времени.
4. Задача сдана. Что дальше?
У каждой задачи есть рейтинг решений. В нем решения упорядочиваются по времени работы, а с равным временем — по дате. После того, как вы сдали задачу, можно обратиться в этот рейтинг и оценить эффективность своего решения.
Вы всегда можете обсудить одну из задач или систему в целом на форуме. Если вы нашли ошибку в задаче, то напишите об этом в форуме с пометкой «To admins» в начале темы. Если ваше решение засчитано в Архиве задач, но у вас есть тест, который оно не проходит, то присылайте этот тест по адресу timus_support@acm.timus.ru с темой «Слабые тесты в задаче X».
Как преодолеть превышение лимита времени (TLE)?
Многие программисты всегда утверждают, что проблемы в конкурентном программировании всегда заканчиваются TLE (Time Limit Exceed). Основная проблема этой ошибки заключается в том, что она не позволит вам узнать, достигнет ли ваше решение правильного решения или нет!
Почему TLE приходит?
- Ограничения онлайн-судьи: TLE имеет место из-за того, что у онлайн-судьи есть некоторые ограничения, которые не позволяют обрабатывать инструкцию после определенного срока, установленного постановщиком задач (обычно 1 секунда).
- Конфигурация сервера . Точное время, затрачиваемое кодом, зависит от скорости сервера, архитектуры сервера, ОС и, конечно, от сложности алгоритма. Поэтому разные серверы, такие как практика, codechef, SPOJ и т. Д., Могут иметь разную скорость выполнения. Оценив максимальное значение N (N — это общее количество инструкций всего вашего кода), вы можете приблизительно оценить, произойдет ли TLE или нет в течение 1 секунды.
Таким образом, проанализировав эту диаграмму, вы можете приблизительно оценить сложность времени и сделать свой код в пределах верхнего предела.
Ошибки лимита времени OverCome
- Измените методы ввода-вывода: вы должны выбрать правильные функции ввода-вывода и структуру данных, которые помогут вам в оптимизации.
- В C ++ не используйте cin / cout — используйте scanf и printf.
- В Java не используйте сканер — используйте вместо него BufferedReader.
- В Python вы можете попробовать ускорить свои решения, добавив следующие две строки в начало вашего файла:
В конечном счете, с опытом вы обязательно узнаете, что делать, а что не избегать TLE. Чем больше вы кодируете, тем больше вы узнаете о том, как конкурировать с TLE.
Эта статья предоставлена Shubham Bansal . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
0 / 4 / 0
Регистрация: 31.10.2016
Сообщений: 21
1
22.02.2018, 21:15. Показов 8216. Ответов 3
Решаю задачки на одном сайте, там есть онлайн компилятор. Моя VS справляется, но компилятор с сайта говорит Time limit exceeded. Т.к. задача состоит из нескольких классов опишу только проблемный.
В этом классе метод должен принимать List<List<string>> text (мы разбили большой текст на предложения, а после на слова, в конечном итоге List<List<string>> состоит только из слов с нижним регистром)
Сама задача: Биграмма — это пара соседних слов предложения. Например, из текста: «She stood up. Then she left.» можно выделить следующие биграммы «She stood», «stood up», «Then she» и «she left», но не «up then».
Составьте словарь, который для каждого слова W хранит вторую часть V, наиболее частотной биграммы (W, V), начинающейся с W. Такой словарь называется биграммной моделью текста.
Ключи этого словаря — это все слова, с которых начинается хотя бы одна биграмма исходного текста. В качестве значения должно быть второе слово самой частой биграммы, начинающейся с ключа.
Если есть несколько биграмм с одинаковой частотой, то использовать лексикографически первую(в алфавит порядке) (используйте способ сравнения Ordinal, например с помощью метода string.CompareOrdinal).
В итоге должны получить Dictionary<string,string>. Вот мой код программы, подскажите,что в нем не так, в нем есть ошибка, или его надо оптимизировать?Если оптимизировать, то помогите!
За говнокод сорри.
C# | ||
|
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
2
Содержание
- 1 Общий принцип
- 2 Ввод и вывод данных
- 3 Тестирование решений
- 3.1 CE — Ошибка компиляции (Compilation Error)
- 3.2 TLE — Нарушен предел времени (Time Limit Exceeded)
- 3.3 ILE — Нарушен предел ожидания (Idleness Limit Exceeded)
- 3.4 MLE — Нарушен предел памяти (Memory Limit Exceeded)
- 3.5 RTE — Ошибка во время выполнения (Run-time Error)
- 3.6 PE — Ошибка представления (Presentation Error)
- 3.7 WA — Неправильный ответ (Wrong Answer)
- 3.8 OK — Принято (Accepted)
- 3.9 CF — Ошибка тестирования (Check Failed)
- 3.10 SV — Нарушение безопасности (Security Violation)
- 4 Особенности языков программирования
- 4.1 Выбор языка программирования
- 5 Конфигурация тестирующего сервера
- 6 Языки программирования
Общий принцип
В систему посылаются только файлы с исходным кодом, а сама посылаемая программа должна состоять только из одного файла: *.dpr
, *.cpp
, *.java
, *.pas
и т. д. Нельзя отправить в систему скомпилированный exe-файл, файл проекта Visual Studio и т. п.
В решениях запрещается:
- осуществлять доступ к сети;
- выполнять любые операции ввода/вывода, кроме открывания, закрывания, чтения и записи стандартных потоков stdin, stdout, stderr и файлов с именами, явно прописанными в условии задачи;
- сознательно «ломать» тестирующую систему;
- выполнять другие программы и порождать новые процессы;
- изменять права доступа к файловой системе;
- работать с поддиректориями;
- создавать и манипулировать ресурсами GUI (окна, диалоговые сообщения и т. д.);
- работать со внешними устройствами (звук, принтер и т. д.);
- выполнять прочие действия, призванные нарушить ход учебного процесса.
Решения выполняются в специальном окружении, обеспечивающем безопасный запуск, и попытка выполнить какие-либо из указанных действий закончится, скорее всего, получением вердикта «Ошибка во время выполнения».
Ввод и вывод данных
Во всех задачах необходимо считывать входные данные из текстового файла и выводить результат в текстовый файл. Имена файлов указаны в условии задачи. Предполагается, что файлы располагаются в текущем каталоге программы, поэтому в решениях можно и нужно использовать только их имена без абсолютных путей в файловой системе тестирующего сервера.
Можно считать, что изначально при запуске решения выходной файл будет отсутствовать, и решение должно его создать и записать туда ответ.
Внимательно проверяйте имена файлов в решениях на соответствие условию задачи.
Если в коде решения имена файлов указаны неверно, это может приводить к непредсказуемым последствиям. Так, если имя выходного файла указано неверно и требуемый по условию файл не создаётся, система, скорее всего, выдаст вердикт «Ошибка представления».
В случае, когда в решении на Java перепутано имя входного файла и делается попытка открыть несуществующий файл, выбрасывается исключение. Если автор решения не перехватывает его, программа завершается с вердиктом «Ошибка во время выполнения». Если же исключение обрабатывается, то вполне возможны и другие вердикты в зависимости от того, отработает ли программа и что окажется в выходном файле. Если в решении на C++ неправильно указан входной файл и ошибки специально не обрабатываются, чтение из файла может приводить к чтению произвольных данных («мусора»). Если в программе вместо чтения из файла делается попытка считать данные со стандартного ввода (stdin, который обычно связан с клавиатурой консоли), программа заблокируется («повиснет») в ожидании ввода и будет завершена с вердиктом «Превышен предел времени».
Решение может выводить произвольные данные «в консоль», то есть в стандартные потоки stdout, stderr, которые обычно связаны с консольным окном (например для отладки). Это не запрещается и не влияет на результат. Проверяется только содержимое выходного файла. Следует помнить, что на вывод тратится дополнительное время, поэтому большой объём отладочной информации может критически замедлить вашу программу. Вывод в stderr медленнее, чем в stdout, поскольку не буферизируется.
Тестирование решений
Каждое отправленное решение проходит на сервере проверку на нескольких тестах. Задача считается решённой только в случае прохождения всех тестов. Решение запускается на всех тестах, которые есть по задаче, и процесс тестирования не прерывается на первом непройденном тесте, как это делается в соревнованиях типа ACM.
Тестирование осуществляется автоматически, поэтому решения должны строго следовать формату входных и выходных данных, который описан в условии. В случае неясности можно задавать вопросы преподавателям. Если не сказано явно, все входные данные можно считать корректными и удовлетворяющими ограничениям из условия. Например, если сказано, что на входе целое число от 1 до 100 включительно, то можно считать, что это так и есть, и проверять неравенства и выводить ошибку в случае, если это не так, в коде решения нет необходимости.
Тесты по каждой задаче не упорядочены по сложности, по размеру входных данных, по какому-то иному критерию, а следуют в исторически сложившемся порядке их добавления в систему.
Не гарантируется, что первый тест в системе будет совпадать с тестом из условия (зачастую это не так).
Результатом проверки является итоговое сообщение системы и, возможно, в скобках номер первого теста, вызвавшего ошибку (если таковая имела место). Например, вердикт «Неправильный ответ (43)» означает, что решение успешно скомпилировалось и прошло без ошибок первые 42 теста по задаче, но на тесте под номером 43 выдало неверный ответ.
Далее опишем все допустимые сообщения тестирующей системы и укажем возможные причины их появления.
CE — Ошибка компиляции (Compilation Error)
Не удалось скомпилировать решение и получить исполняемый файл для запуска. Решение в таком случае, очевидно, не может быть проверено ни на одном тесте.
Посмотреть вывод компилятора и понять, почему код не удаётся скомпилировать, можно путём нажатия на иконку в таблице с вашими решениями. Наиболее частые причины ошибки компиляции: выбран неверный компилятор (для другого языка программирования или же несовместимая версия, например Java v7 вместо Java v8), отправляется не тот файл (файл проекта IDE вместо файла с исходным кодом).
Время работы компилятора ограничено 30 секундами. Если он не успел отработать по каким-либо причинам, также будет выставлен вердикт «Ошибка компиляции».
TLE — Нарушен предел времени (Time Limit Exceeded)
Для каждого теста установлено своё ограничение по времени (Time Limit) в секундах. Для разных тестов по одной задаче ограничение по времени может быть разным.
Тестирующая система учитывает так называемое процессорное время (CPU Time) выполнения процесса в операционной системе. Нет смысла делать решение задачи многопоточным, потому что распараллеливание хоть и позволяет сократить реальное время работы (Wall Time), но не уменьшает процессорное время.
Процесс-решение запускается на тесте, и если процесс не успевает завершиться в течение отведённого времени, он принудительно завершается и выставляется вердикт «Нарушен предел времени». В качестве времени работы решения на тесте указывается то время, которое процесс фактически проработал до того, как был приостановлен. Нет возможности узнать, сколько бы программа проработала, если бы не была снята по времени. Если при ограничении по времени на тест в 1 секунду вы видите, что решение получает вердикт «Нарушен предел времени» и работает 1015 мс, то нельзя это понимать как «решение чуть-чуть не успевает, надо ускорить его на 15 мс». Если решение останавливается по времени, то вывод программы никак не проверяется на предмет его правильности.
Возможные причины появления ошибки «Нарушен предел времени»:
- неэффективный алгоритм (например, в решении реализован алгоритм с временной сложностью Ω(n2), хотя задача предполагает решение за O(n log n));
- недостаточно эффективная программная реализация (идея и алгоритм правильные, но код написан не очень хорошо: например, ввод данных из файла осуществляется медленно, чрезмерно часто выделяется и освобождается память);
- попытка чтения данных с консоли (
std::cin
,scanf()
,getchar()
в C++,System.in
в Java), тогда как нужно читать входные данные из файла (в этом случае программа блокируется в ожидании ввода и зависает, не расходуя при этом CPU Time, поэтому такой случай тестирующая система обрабатывает отдельно); - ошибка в программе (например, программа входит в бесконечный цикл).
Не рекомендуется «пропихивать» медленное решение, отправляя его многократно, пока система не «согласится» его принять. Решение в любой момент может быть перетестировано и, соответственно, может перестать быть принятым из-за нарушения предела времени.
ILE — Нарушен предел ожидания (Idleness Limit Exceeded)
Программа зависла в ожидании, не потребляя при этом ресурсы процессора.
Такое может быть, например, если согласно условию чтение входных данных осуществляется из файла, а решение выполняет ввод с консоли. В этом случае процесс решения заблокируется в ожидании нажатия клавиш на клавиатуре. Через некоторое время система тестирования принудительно завершит этот процесс и выставит вердикт ILE.
MLE — Нарушен предел памяти (Memory Limit Exceeded)
Программа использует слишком много оперативной памяти, стоит проанализировать использование памяти и оптимизировать его.
Также причиной чрезмерного использования памяти может быть ошибка в программе, например, вечный цикл в теле которого на каждой или некоторых итерациях выделяется дополнительная память. К используемой памяти относится не только память с данными, но также память с кодом и программным стеком.
Ограничение по памяти есть не для всех задач. Гарантируется, что для всех тестов в рамках одной задачи ограничение по памяти одинаково.
Как и в случае нарушения ограничения по времени, программа при нарушении ограничения по памяти аварийно завершается тестирующей системой, её вывод не проверяется на правильность. Точно так же не следует воспринимать размер памяти, использованной до момента аварийного завершения, как объём, которого решению хватило бы для успешной работы. Более точно, вердикт MLE, полученный с использованием 257 МБ памяти, говорит о том, что приложение успело использовать 257 МБ памяти и было принудительно остановлено, но ничего не говорит о том, сколько памяти использовало бы приложение, не будучи принудительно остановленным.
В некоторых случаях при разовом выделении чрезмерно большого блока в памяти, этот запрос может быть не выполнен операционной системой, что в результате может привести к ошибке во время выполнения или (значительно реже) другому результату неопределённого поведения в случае с языком C++.
RTE — Ошибка во время выполнения (Run-time Error)
В операционной системе есть такое понятие, как код завершения процесса (Exit Code). Этот подход используется как в Windows, так и в ОС семейства UNIX. Это целое число, которое остаётся после прекращения выполнения программы. Общепринятое соглашение гласит, что нулевой код завершения свидетельствует о нормальном завершении процесса без ошибок, любой другой — об ошибке. Тестирующая система проверяет код завершения вашего решения, и если он не равен нулю, выставляет вердикт «Ошибка во время выполнения». При этом никак не проверяется то, что решение успело вывести в выходной файл.
Укажем типичные причины ошибок во время выполнения.
- Использована директива
package
в коде программы на Java.- В результате программа на Java находится не в пакете по умолчанию. Компилятор Java сгенерировал класс в некотором пакете (ошибки компиляции нет), а при запуске виртуальная машина Java не смогла найти этот класс, потому что искала в пакете по умолчанию (возникло исключение
ClassNotFoundException
с сообщением Could not find or load main class).
- В результате программа на Java находится не в пакете по умолчанию. Компилятор Java сгенерировал класс в некотором пакете (ошибки компиляции нет), а при запуске виртуальная машина Java не смогла найти этот класс, потому что искала в пакете по умолчанию (возникло исключение
- Выход за границы допустимой области памяти в программе на C++.
- Выход за границы массива, разыменование неправильного указателя, обращение к нулевому указателю.
- Переполнение системного стека.
- Эта причина является частой в случае рекурсии. Вообще, системный стек используется для размещения параметров функций, локальных переменных. Его размер, как правило, невелик и по умолчанию равен 1 МБ. При вызове функции стековая структура позволяет естественным образом сохранить текущие состояния всех локальных переменных и вернуться к ним, когда вызов завершится и управление вернётся в исходную точку. Если в алгоритме используется глубокая рекурсия, то размера стека может не хватить для хранения контекстов всех вызовов. Решений этой проблемы два:
- переписать алгоритм нерекурсивно (например с использованием своего стека, а не системного);
- увеличить размер системного стека, что делается по-разному для разных языков программирования (см. примеры для C++ (Visual Studio) и Java).
- Эта причина является частой в случае рекурсии. Вообще, системный стек используется для размещения параметров функций, локальных переменных. Его размер, как правило, невелик и по умолчанию равен 1 МБ. При вызове функции стековая структура позволяет естественным образом сохранить текущие состояния всех локальных переменных и вернуться к ним, когда вызов завершится и управление вернётся в исходную точку. Если в алгоритме используется глубокая рекурсия, то размера стека может не хватить для хранения контекстов всех вызовов. Решений этой проблемы два:
- Ошибка ввода-вывода (попытка открыть несуществующий входной файл).
- Нужно проверить правильность имени входного файла.
- Программа целенаправленно была завершена с ненулевым кодом выхода.
- В программе на C++ это может быть, если функция
main()
в C++ вернула ненулевой код (return (non-zero)
в функцииmain()
). Рекомендуется завершать функциюmain()
операторомreturn 0
(в старых компиляторах C++ это обязательно, современные компиляторы же подразумевают возврат нулевого кода автоматически). Также программу на C++ с произвольным кодом завершает вызовexit()
. - В программе на Java можно завершить процесс с произвольным кодом с помощью
System.exit()
.
- В программе на C++ это может быть, если функция
- Необработанное исключение.
- Причин возникновения исключений может быть масса. Например, если в Java функции
Integer.parseInt()
/Double.parseDouble()
была передана строка, содержащая пробельные символы (ASCII-коды 9, 10, 13, 32), выбрасывается исключениеNumberFormatException
.
- Причин возникновения исключений может быть масса. Например, если в Java функции
- Целочисленное деление на ноль.
- При выполнении деления нужно всегда думать, а не может ли делитель оказаться равным нулю. В то же время стоит отметить, что вещественное деление на ноль (в типах с плавающей точкой
double
,float
) по умолчанию не приводит к завершению программы, а даёт специальные значения+Inf
,-Inf
илиNaN
.
- При выполнении деления нужно всегда думать, а не может ли делитель оказаться равным нулю. В то же время стоит отметить, что вещественное деление на ноль (в типах с плавающей точкой
PE — Ошибка представления (Presentation Error)
Наиболее частая причина возникновения этой ошибки — не найден выходной файл. Возможно, вы забыли создать выходной файл и выводите ответ в консоль (он в таком случае игнорируется). Проверьте имена входного и выходного файла в вашей программе на соответствие условию задачи. Исторически сложилось, что в разных задачах входной и выходной файл именуются по разным правилам: input.txt и output.txt, in.txt и out.txt, input.in и output.out (обратите внимание, что нет расширения txt), [задача].in и [задача].out…
Для некоторых задач программа проверки (checker) дополнительно удостоверяется, что ваш вывод соответствует определённому формату, и выдаёт ошибку представления в случае, если это не так. Например, если в задаче нужно вывести число, а вы выводите строку. Или если в задаче нужно вывести сначала число k, затем k чисел, а ваше решение выводит число k и далее (k + 1) чисел (то есть решение выводит в файл лишние данные).
Также имейте в виду, что отлавливание исключений и других ошибок не должно быть самоцелью. Если исключение не обрабатывается каким-либо образом, обычно нет смысла его ловить по следующей причине. Аварийное завершение работы программы в результате ошибки во время выполнения приводит к вердикту «Ошибка во время выполнения», только если соответствующее исключение было «проброшено» наружу, а не «заглушено» на каком-то этапе. Если исключение отлавливается, но никак не обрабатывается, то в результате возникновения соответствующей ошибки следует ожидать вердикт «Ошибка представления» или же «Неправильный ответ» (реже).
WA — Неправильный ответ (Wrong Answer)
Для многих задач ответ однозначен, и проверяется просто побайтовое совпадение вашего выходного файла и сохранённого правильного ответа. Такая проверка требует строгого соблюдения формата файла, не допускает незначащих пробелов и пустых строк. Например, если правильный ответ имеет вид (пробелы обозначены символом ␣)
5 1␣2␣3␣4␣5
и решение вывело
5 1␣2␣3␣4␣5␣
(лишний пробел в конце второй строки), то будет получен вердикт «Неправильный ответ». Для некоторых задач написаны проверяющие программы (checker), которые к таким различиям лояльны и засчитывают ответы с лишними пробелами как правильные. Всегда точно следуйте формату файла и не выводите лишних пробелов, и проблем не будет.
После последней строки файла можно выводить или не выводить перевод строки — не важно. Есть две точки зрения в зависимости от того, с какой стороны смотреть на символ перевода строки:
- каждая строка завершается переводом строки, поэтому
n
в конце файла нужен; - перевод строки является разделителем между соседними строками, поэтому
n
в конце файла не нужен.
Первая точка зрения является общепринятой. Так, компилятор gcc, система контроля версий git и многие другие программы выдают предупреждение no newline at the end of file, если в самом конце файла нет символов новой строки. Обсуждение вопроса можно почитать на stackoverflow.
Поэтому рекомендуется придерживаться первого подхода и завершать все строки переводами строк.
Другие очевидные причины получения неправильного ответа:
- неверный алгоритм;
- ошибка в программе.
Бывает такое, что решение от запуска к запуску даёт разные ответы, или же правильно работает на одном компьютере и неправильно на другом. Такие случаи, как правило, связаны с ошибками в решениях.
OK — Принято (Accepted)
Программа работает правильно и прошла все тесты с соблюдением всех ограничений.
Если решение принято системой, это ещё не означает, что в его основе лежит правильный алгоритм. В любой момент могут появиться новые наборы входных данных, на которых будут заново протестированы все решения по задаче. Если ваше решение на самом деле не полностью верно и прошло только из-за недостаточно сильного набора тестов, оно может в будущем потерять статус «Принято».
CF — Ошибка тестирования (Check Failed)
Если указан номер теста, то программа успешно завершается на предложенном тесте (укладывается в отведённые время и память и не совершает ошибок во время выполнения), но результат не удаётся проверить из-за ошибок в программе проверки. Вашей ошибки в этом случае, возможно, никакой нет и после исправления программы проверки будет получен вердикт OK. Не исключены ещё два варианта: WA, PE.
Имейте в виду, что если ошибка тестирования возникает на первом же тесте, то на остальных Ваше решение не запускается вовсе. Соответственно, в этом случае после устранения ошибок программы проверки вердикты TLE, MLE, RTE также могут возникнуть в любом тесте, кроме первого.
Если же номер теста, на котором возникает ошибка тестирования, не указан, значит, программа проверки не была скомпилирована, а Ваше решение не запускалось вовсе. В этом случае правильным может быть любой вердикт, отличный от CF.
Если у Вас возникла ошибка тестирования, мы, скорее всего, это заметим достаточно быстро. Тем не менее, имеет смысл задать вопрос через пункт «Сообщения» в меню курса. Не забывайте выбрать задачу, которой касается этот вопрос.
SV — Нарушение безопасности (Security Violation)
Ошибка означает, что программа попыталась выполнить запрещённые действия.
К их числу относится попытка создания новых процессов. Вашим решениям запрещено запускать на выполнение другие программы. Например, в коде
порождается новый процесс командной оболочки cmd.exe и в нём выполняется команда pause. Пожалуйста, не пишите так, для достижения аналогичного эффекта можно использовать другие приёмы.
Особенности языков программирования
У каждого конкретного языка программирования есть свои особенности, о которых полезно знать. Далее рассмотрены отдельные особенности написания решений на разных языках программирования:
- C++;
- Java;
- C#;
- Python.
Выбор языка программирования
Разные задачи можно решать на разных языках. Часто для конкретной задачи тот или иной язык оказывается предпочтительным. Например, если в задаче требуются тяжёлые вычисления, то её может быть проще сдать на C++, чем на Java, за счёт более быстрой работы программы на C++ (для кода на Java могут потребоваться более изощрённые оптимизации, чтобы он прошёл по времени). С другой стороны, если задача требует проведения вычислений с большими целыми числами, выходящими за пределы диапазона 64-битных переменных, то есть «длинной арифметики», то решение существенно проще написать на Java, воспользовавшись готовым качественно написанным классом BigInteger
для операций с числами произвольной длины.
Конфигурация тестирующего сервера
Сервер, на котором осуществляется запуск решений, является виртуальной машиной, выполняющейся внутри Microsoft Hyper-V Server 2012 R2. Виртуальный компьютер работает под управлением Windows 7 Professional x64, оснащён процессором Intel® Core™ i3-4130 (Haswell, кэш 3 МБ, 3,40 ГГц, доступно только одно ядро) и 4 ГБ оперативной памяти. Для хранения входных и выходных файлов используется RAM-диск, чтобы обеспечить максимальную производительность ввода-вывода.
Языки программирования
На странице учебного курса в системе на вкладке «Компиляторы» можно ознакомиться с актуальным списком доступных языков программирования, версиями компиляторов и параметрами командной строки их вызова.
Размер системного стека явно не задаётся (используется размер по умолчанию). При компиляции кода на C++ включен режим оптимизации O2.
Improve Article
Save Article
Improve Article
Save Article
Many programmers always argue that the problems in Competitive Programming always end up with TLE(Time Limit Exceed). The main problem with this error is that it will not allow you to know that your solution would reach to correct solution or not!
Why TLE comes?
- Online Judge Restrictions: TLE comes because the Online judge has some restriction that it will not allow to process the instruction after a certain Time limit given by Problem setter the problem(1 sec).
- Server Configuration: The exact time taken by the code depends on the speed of the server, the architecture of the server, OS, and certainly on the complexity of the algorithm. So different servers like practice, CodeChef, SPOJ, etc., may have different execution speeds. By estimating the maximum value of N (N is the total number of instructions of your whole code), you can roughly estimate the TLE would occur or not in 1 sec.
MAX value of N Time complexity 10^9 O(logN) or Sqrt(N) 10^8 O(N) Border case 10^7 O(N) Might be accepted 10^6 O(N) Perfect 10^5 O(N * logN) 10^4 O(N ^ 2) 10^2 O(N ^ 3) <= 160 O(N ^ 4) <= 18 O(2N*N2) <= 10 O(N!), O(2N)
- So after analyzing this chart you can roughly estimate your Time complexity and make your code within the upper bound limit.
- Method of reading input and writing output is too slow: Sometimes, the methods used by a programmer for input-output may cause TLE.
Overcome Time Limit Errors
- Change methods of Input-Output: You must choose proper input-output functions and data structure that would help you in optimization.
- In C++, do not use cin/cout – use scanf and printf instead.
- In Java, do not use a Scanner – use a BufferedReader instead.
- Bounds of loops may be reduced: Read the bounds in the input carefully before writing your program, and try to figure out which inputs will cause your program to run slower. For example, if a problem tells you that N <= 100000 or N<=1000000, and your program has nested loops each which go up to N, your program will never be fast enough.
- Optimize your Algorithm: If nothing works after all this, then you should try changing the algorithm or the approach you are using to solve your problem. Generally, the internal test cases are designed in such a way that you will be able to clear all of them only if you choose the best possible algorithm.
- Look for Suggestions given: Although this should be the last step, you must look at the comments given below, any problem in which other programmers might have given a hint on how the problem can be solved better and more efficiently hinted at. And even when you overcome TLE try more exhaustive and corner test cases against your program to check the performance.
Ultimately, with experience, you’ll surely come to know what to do and what not to avoid TLEs. The more you code the more you get to know about how to compete for TLE.
Practice Now
This article is contributed by Shubham Bansal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or have more information about the topic discussed above.
Сообщение | Кратко | Сообщается ли номер теста? | Значение вердикта | Возможная причина |
---|---|---|---|---|
OK | OK | Нет | Решение зачтено | Программа верно работает на соответствующем наборе тестов |
Compilation error | CE | Нет | Компиляция программы завершилась с ошибкой | 1. в программе допущена синтаксическая или семантическая ошибка 2. неправильно указан язык |
Wrong answer | WA | Да | Ответ неверен | 1. ошибка в программе 2. неверный алгоритм |
Presentation error | PE | Да | Тестирующая система не может проверить выходные данные, так как их формат не соответствует описанному в условиях задачи | 1. неверный формат вывода 2. программа не печатает результат 3. лишний вывод |
Time-limit exceeded | TL | Да | Программа превысила установленный лимит времени | 1. ошибка в программе 2. неэффективное решение |
Memory limit exceeded | ML | Да | Программа превысила установленный в условиях лимит памяти | 1. ошибка в программе (например, бесконечная рекурсия) 2. неэффективное решение |
Output limit exceeded | OL | Да | Программа превысила установленный в условиях лимит вывода | 1. программа выводит больше информации, чем установлено в ограничениях |
Run-time error | RE | Да | Программа завершила работу с ненулевым кодом возврата | 1. ошибка выполнения 2. программа на C или C++ не завершается оператором return 0 3. ненулевой код возврата указан явно 4. Программа на Java описана в пакете |
Precompile check failed | PCF | Нет | Программа не прошла проверку на качество кода перед компиляцией | 1. плохое качество кода 2. неправильно отформатированный код |
Idleness limit exceeded | IL | Да | Программа слишком долго не отвечала на запросы системы и не выполняла действий | 1. программа ожидает ввода с консоли, которого не должно быть 2. не использован flush() |