2015-03-25 2 views
1


Сначала я хотел бы сказать, что C++ не является моим основным языком, и я прошу прощения, если это базовые знания.
Моя проблема в том, что я должен преодолеть временной интервал с помощью моего алгоритма. Я уверен, что сам алгоритм хорош (и мне не нужна помощь;)), но данные, переданные ему, даются с консоли.
Мне нужно прочитать случайное число целых чисел (предел 10^7) в одной строке, завершенной символом EOF. До сих пор я получил что-то вроде этого:

Ускоренный способ чтения случайного числа целых чисел из консоли C++

cin.tie(NULL); 
std::ios::sync_with_stdio(false); 

vector <unsigned int > vector_of_int; 

... 

std::string str; 
std::getline(std::cin, str); 
std::istringstream sstr(str); 
unsigned int n; 

while(sstr >> n){ 
    vector_of_int.push_back(n); 
} 

Однако - это не достаточно быстро, чтобы вписаться в лимит времени для выполнения этой задачи. Итак, вопрос в том, есть ли более быстрый способ (spoj-friendly) для чтения таких данных?

Мои результаты

number  status signal time memory 
test 0  passed OK  0.0s 2828KB 
test 1  passed OK  0.0s 2828KB 
test 2  passed OK  0.01s 2828KB 
test 3  passed OK  0.0s 2828KB 
test 4  passed OK  0.01s 2828KB 
test 5  passed OK  0.0s 2828KB 
test 6  passed OK  0.0s 2940KB 
test 7  passed OK  0.04s 3060KB 
test 8  passed OK  0.24s 3452KB 
test 9  passed OK  0.44s 3452KB 
test 10  passed OK  0.84s 3452KB 
test 11  TLE  OK  1.01s 27784KB 
test 12  TLE  OK  1.01s 28056KB 



EDIT:
Результаты после комментируя vector_of_int.push_back(n); линии

number status   signal time memory 
test 0 passed   OK  0.0s 2828KB 
test 1 wrong answer OK  0.0s 2828KB 
test 2 wrong answer OK  0.0s 2828KB 
test 3 wrong answer OK  0.0s 2828KB 
test 4 wrong answer OK  0.0s 2828KB 
test 5 wrong answer OK  0.0s 2828KB 
test 6 wrong answer OK  0.01s 2964KB 
test 7 runtime error SIGSEGV 0.02s 3128KB 
test 8 runtime error SIGSEGV 0.06s 5504KB 
test 9 runtime error SIGSEGV 0.09s 8032KB 
test 10 runtime error SIGSEGV 0.16s 13224KB 
test 11 runtime error SIGSEGV 0.21s 14976KB 
test 12 runtime error SIGSEGV 0.28s 23440KB 



EDIT 2:
Я заметил, что вход лин e прерывается EOF вместо новой строки.

+0

Как близко вы к делу? т. е. нужно ли нам использовать весь подход или мы можем его настроить? – Bathsheba

+0

Нужно ли приходить с консоли? Файл будет лучше. Можете ли вы дождаться начала теста до тех пор, пока не загрузите свои входы? Кроме того, вы должны определенно по крайней мере добавить код таймера внутри этой программы (или запустить профайлер), чтобы диагностировать, является ли это даже вашим узким местом. – VoidStar

+0

@ Батшеба: Я отредактировал свой ответ. –

ответ

0

Я нашел решение!

vector <int> vector_of_int; 
vector_of_int.reserve(1e7); 

char ch; 
int i = 0; 
int acc = 0, buf; 

while((ch=getchar()) > 0){ 
    if(ch!=' ') { 
     acc = acc * 10 + ch - '0'; 
    } else { 
     vector_of_int.push_back(acc); 
     acc = 0; 
    } 
} 

Это дало мне результаты, приведенные ниже

number status signal time memory 
test 0 passed OK  0.0s 2688KB 
test 1 passed OK  0.01s 2688KB 
test 2 passed OK  0.01s 2688KB 
test 3 passed OK  0.01s 2688KB 
test 4 passed OK  0.01s 2688KB 
test 5 passed OK  0.01s 2688KB 
test 6 passed OK  0.01s 2688KB 
test 7 passed OK  0.01s 2688KB 
test 8 passed OK  0.12s 2688KB 
test 9 passed OK  0.23s 2688KB 
test 10 passed OK  0.46s 2688KB 
test 11 passed OK  0.63s 2688KB 
test 12 passed OK  0.86s 2688KB 

Я не изменить одну строку в алгоритме, так что сделал трюк.

1

Учитывая данные результаты, я полагаю, вы можете прийти в соответствии с целевым включением линии

vector_of_int.reserve(1e7);

перед вызовом любойpush_back.

Эта строка сообщает vector зарезервировать память для приема не менее 1e7 элементов. Это предотвратит перераспределение памяти, которое, как представляется, в настоящее время происходит. 1e7 четко задокументирован в вашем вопросе как верхний предел.

+0

Простите, не то. Тест 10 получает 0,81 с, а тест 9 получает 0,43 с \t. :) –

Смежные вопросы