|
|
Любимые числа Деда Мороза
|
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:
- 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
Ответить
|