21 / 28
Mar 2019

Na pierwszy rzut oka iterowanie masz w porządku. Według mnie błąd masz w samej logice. Być może źle interpretujesz treść zadania, bo jest trochę pogmatwana (chociaż przykładowe testy powinny rozwiać wszelkie wątpliwości). Ewentualnie (aczkolwiek w to raczej wątpię) nie wiesz do końca jak działa set.

Kod powinien wyglądać jakoś tak:

if (ciag.size() < pozycja) {
	cout << '-' << '\n';
} else if (ciag.size() == pozycja) {
	cout << *ciag.cbegin() << '\n';
} else {
	set<int>::iterator it = ciag.cend(); // auto it = ciag.cend();
	while (pozycja--) it--;
	cout << *it << '\n';
}

Prawdopodobnie masz jeszcze coś nie tak z wczytywaniem danych. Jest trochę udziwnione, więc nie chciało mi się go sprawdzać. Wkleiłem wczytywanie z mojego kodu i przeszło. Użyj std::getline i std::istringstream (do rozdzielenia łańcucha na liczby). Dodatkowo w tym przypadku lepiej nadałby się std::vector zamiast std::set.

Dzięki twojej korekcie przynajmniej dla przykładu testowgo mam dobre wyniki. THX. Niestety dalej WA.
Założenie miałem takie żeby mieć posortowane dane bez dublikatów i iterować od wartości max do wymaganej (o ile to możliwe). Uznałem że najlepszy będzie set bo już przy wpisaniu znikną dublikaty i będzie posortowane.
Dlaczego uważasz że vector będzie lepszy? Dojdą przecież dwie operacje które mogą znacznie wydłużyć czas przy większej liczbie danych. (choć vector jest moim ulubionym STL)
Jeżeli chodzi o std::getline i std::istringstream to chciałem spróbować bez striga żeby było szybciej ale chyba przejdę na twoje.
Dzięki.

PS właśnie zrobiłem jak sugerowałaś getline + istringstream = AC, dzięki :slight_smile:

oj @nenow79, daleka i długa jeszcze przed tobą droga :wink:

PS
@hipcia jak już coś, to sugerowałeś, nieprawdaż? :wink:

A wiesz że napisałem sugerowałeś ale poprawiłem na -aś bo dla mnie wszystko co ma ostatnią literkę -a jest ksywką kobiecą :slight_smile:

Jeżeli -eś to proszę o wybaczenie :slight_smile:

@nenow79 wstawianie i wyszukiwanie elementów dla setu ma złożoność logarytmiczną. To się kumuluje i w konsekwencji zajmuje więcej czasu. Nie bez przyczyny set nie ma iteratora z dostępem losowym. Trochę bardziej sensowne jest wstawianie danych do std::unordered_set (hashed & unsorted) z następnym przekopiowaniem go do vectora i sortowaniem.
Gdy chcemy wstawiać dużo elementów na koniec, nie będziemy nic usuwać, ale chcemy w miarę szybko sortować i mieć dostęp losowy to najlepszy jest sam vector.

@narbej nawet tego nie zauważyłem. Muszę przyznać rację :smiley:

2 years later

Witam, mam problem z tym zadaniem. Wyniki są poprawne, ale SPOJ nie zalicza (błędna odpowiedź). Przeprowadziłem już wiele testów, ale nadal nie mogę znaleźć błędu. Byłbym wdzięczny za pomoc.

2 1 2
1
2 1 2
1

itd itp