Ошибка time limit exceeded

Задача про очередь в 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, почему то выдало ошибку
enter image description here


Для понятности залил на этот гит два файла, «input» — файл, который платформа тестирования подает на вход, а «output», это правильный ответ на задачу. Мою программу принудительно остановили (из-за превышения времени), и она ничего не выдала
https://github.com/RoyalGoose/testrepos


В чем может быть проблема? Как я могу исправить код, чтобы он работал быстрее и прошел бы этот тест?

Сообщение Кратко Сообщается ли номер теста? Значение вердикта Возможная причина
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()

0 / 4 / 0

Регистрация: 31.10.2016

Сообщений: 21

1

22.02.2018, 21:15. Показов 8422. Ответов 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#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Collections.Generic;
 
namespace TextAnalysis
{
    static class FrequencyAnalysisTask
    {
        public static Dictionary<string, string> GetMostFrequentNextWords(List<List<string>> text)
        {
            var dict = new Dictionary<string, int>();
            var bigram = new Dictionary<string, string>();
            var para = new List<string>();
            int chast = 0;
            string SecondWord = "";
            string FirstWord;
            string wordWas = null;
            for(int j = 0;j< text.Count;j++)
            {
                for (int i = 0; i < text[j].Count - 1; i++)
                {
                    para.Add(text[j][i] + ":" + text[j][i + 1]);
                }
            }
 
            for(int i = 0;i < para.Count;i++)
            {
                if (dict.ContainsKey(para[i]))
                    dict[para[i]]++;
                else
                    dict.Add(para[i], 1);
            }
            for(int i = 0;i<para.Count;i++)
            {
                chast = 0;
                foreach (var d in dict)
                {
                    FirstWord = para[i].Remove(para[i].IndexOf(":"));
                    if ((FirstWord.Equals(d.Key.Remove(d.Key.IndexOf(":"))))&&(d.Value>=chast))
                    {
                        if (string.IsNullOrEmpty(wordWas))
                            wordWas = d.Key.Remove(0, d.Key.IndexOf(":") + 1);
                        if (string.CompareOrdinal(d.Key.Remove(0, d.Key.IndexOf(":") + 1), wordWas) <= 0)
                        {
                            chast = d.Value;
                            SecondWord = d.Key.Remove(0, d.Key.IndexOf(":") + 1);
                            wordWas = SecondWord;
                        }
                    }
                }
                wordWas = null;
                if (!bigram.ContainsKey(para[i].Remove(para[i].IndexOf(":"))))
                {
                    bigram.Add(para[i].Remove(para[i].IndexOf(":")), SecondWord);
                }
            }
            return bigram;
        }
 
    }
}



2



Навигация: Главная страница/Система ejudge/Использование/Вердикты тестирования/Ошибка превышения лимита реального времени

Английское название: Wall Time Limit Exceeded, WT

Данный статус введен в ejudge 2.3.25. В предыдущих версиях вместо данной ошибки диагностировалась ошибка превышения лимита времени.

При работе тестируемой программы возможна ситуация, когда программа не потребляет процессорного времени. Например, программа пытается считывать входные данные со стандартного потока ввода вместо чтения из файла, или выполняет какой-либо системный вызов типа sleep. В таком случае ограничение на процессорное время не позволяет снять процесс за разумное астрономическое время.

Разные тестирующие системы решают эту проблему по-разному. В системе ejudge проблема решается ограниченим максимального астрономического времени (см. астрономическое время) для работы программы (см. max_real_time_limit). Рекомендуется устанавливать ограничение астрономического времени в несколько раз большим, чем ограничение процессорного времени. Если превышено ограничение на астрономическое время, тестируемая программа также снимается с выполнения с данной диагностикой.

Hi the given code is here

int a, b, c, d, e, f;
int fn( int n ) {
    if( n == 0 ) return a;
    if( n == 1 ) return b;
    if( n == 2 ) return c;
    if( n == 3 ) return d;
    if( n == 4 ) return e;
    if( n == 5 ) return f;
    return( fn(n-1) + fn(n-2) + fn(n-3) + fn(n-4) + fn(n-5) + fn(n-6) );
}
int main() {
    int n, caseno = 0, cases;
    scanf("%d", &cases);
    while( cases-- ) {
        scanf("%d %d %d %d %d %d %d", &a, &b, &c, &d, &e, &f, &n);
        printf("Case %d: %dn", ++caseno, fn(n) % 10000007);
    }
    return 0;
}

It has two problems. One is integer overflow. And another is Time Limit Exceeded. I fixed the integer overflow using long int. But problem is with time. When I submit the code, the online judge shows Time Limit Exceeded. Please help me to fix this problem.

Понравилась статья? Поделить с друзьями:
  • Ошибка tighten fuel cap
  • Ошибка tid ingenico ipp320
  • Ошибка ticking player
  • Ошибка the game malfunctioned
  • Ошибка thread stuck in device driver windows 10