Время

23:24:48
19 May 2012

Любимые числа Деда Мороза

Sklyack

Исчерпан лимит времени. Помогите!

Цитата опубликовано 14.03.2011 19:25

Моя прога просто вычёркивает все неподходящие числа из промежутка [1..500000] и считает количество подходящих в заданном подмножестве, делает это практически мгновенно (засекал функцией clock(), получил 0.000000c), символ '\n' после ответа выводится, однако проверяющая система выносит вердикт "Исчерпан лимит времени" ПО ВСЕМ ТЕСТАМ. С чем это может быть связано?

awpris ответил:
Это может быть связано с тем, что Ваш, с Вашей точки зрения, "практически мгновенный" алгоритм, реально работает более 1сек. :)
Sklyack

Цитата опубликовано 14.03.2011 21:55

Ещё раз, соответствующий массив размера 500000 строится за время ~0.000000с (вычислено функцией clock() из библиотеки ctime:

  1. include <ctime>

...
int main()
{
clock_t start=clock();
...
printf("Built in %lf seconds\n", (long double)((clock()-start)/CLOCKSPERSEC)); //подчёркивания в сообщении почему-то залазят под буквы
...
return 0;
} //мб неверно засёк?
). Дальше только ввод A, B, один проход по подмножеству [A..B], и вывод ответа. Неужели эти действия (ввод, проход, вывод) могут выполняться более 1сек?

awpris ответил:
Мы не занимаемся анализом алгоритмов - вместо нас этим занимается система, выдавая свою реакцию на работу конкретной реализации алгоритма на конкретном тесте.
А мы пока системе доверяем... :)
Sklyack

Цитата опубликовано 14.03.2011 22:07

Просто у меня подозрения, что у меня проблема вовсе не в алгоритме, а в банальной ошибке ввода-вывода, вот и интересуюсь какие есть такие вот распространённые ошибки (ввода-вывода), из-за которых местная проверяющая система выносит вердикт TLE абсолютно по всем тестам.

awpris ответил:
Дайте ID отправки - в виде исключения посмотрю.
awpris

Цитата опубликовано 14.03.2011 23:06

Банальная ошибка здесь:
...
while(1) // вечный цикл - вот поэтому и висит!!!
  {
  ef=scanf("%d%d", &A, &B);
     if(!ef || ef==EOF)
         break;
  ...
   }
...
Ваша программа работает с консолью, а не с файлами, и сообщение о конце файла никто вручную ей в систему вводить не будет (если бы работали с файлами - по идее должно было работать - не проверял, извините, некогда).
В условии сказано, что "во входных данных ВСЕГО 2 числа", т.е. задача не мультитестовая... :)

Sklyack

Цитата опубликовано 14.03.2011 23:08

Вот одна из множества попыток: 257360.

Sklyack

Цитата опубликовано 14.03.2011 23:12

Проверенное вами решение далеко не первое, проверку на конец файла я добавил уже от безысходности (авось после ввода есть пустые строки и т.п.). Посмотрите решение по вышеуказанному ID, пожалуйста.

awpris

Цитата опубликовано 14.03.2011 23:36

Ну давайте посчитаем...

У Вас объявлена константа:

const int resh_sz=500000;

Сначала идет цикл
for(int i=1; i < resh_sz; i++){..

Далее есть цикл:
for(int i=1; i < sqrtreshsz; i++){... // символы подчеркивания
                                       //до и после почеркивания;

Далее 2 вложенных цикла:
for(int i=0; i <= 5000; i++)
      for(int j=0; j < 5; j++){...

Разве в сумме это будет не больше секунды?

Sklyack

Цитата опубликовано 14.03.2011 23:46

Если точнее, то в первом цикле ровно 499999 итераций, в следующе паре вложенных
~500000 * sqrt(500000)~7 * 10^7 итераций. Но на самом деле даже меньше, ибо 500000 итераций содержит вложенный цикл, а в него программа заходит только если число i+1 простое (все составные, меньшие i+1, вычёркиваются раньше).
Как Вы поняли, эта часть программы на моём компьютере выполняется меньше секунды (хотя не спорю, характерестики машины не слабые).
Последняя же пара вложенных циклов в сумме содержит смехотворно малое число итераций: 5*5000=25000, а функция, вызываемая в нём, выполняется за O(pos), pos=0,1,2,3,4.

Отредактировано :)

awpris ответил:
ПЕРВЫЙ цикл содержит ровно 500000 тысяч итераций:
for(int i=1; i < resh_sz; i++) resh[i]=true;
А то, что Вы написали, относится уже ко второму циклу... :)
awpris

Цитата опубликовано 14.03.2011 23:59

Вот Вам и красивая задачка на тему Петра Митричева "от L до R" :)

Совет: забудьте о написанном Вами алгоритме и напишите с нуля другой - ну хотя бы своеобразное (под задачку) решето Ератосфена с дополнительной проверкой - у моих ребят оно проходило.

Sklyack

Цитата опубликовано 14.03.2011 23:59

Ах, действительно, проблема в алгоритме, я попробовал отправить решение только для
0<=A,B<=50000,
и TLE исчез (естественно при этом мне вынесли вердикт WA). Спасибо за Вашу помощь и прошу прощения если отнял много времени.

awpris ответил:
Да не за что... :) Просто я сегодня немного посвободней и поэтому имел возможность более пространно ответить на возникшие вопросы, а такая вольность со временем у меня бывает очень редко.

1 2