26 / 28
Mar 2019
10 months later

Z treści zadania:
"Zestawy składają się z liczby całkowitej, po której następuje spacja i ciąg liczb całkowitych rozdzielonych spacjami."
Czy możliwe jest by po pierwszej liczbie całkowitej wystąpił ciąg liczb, ktory nie zawiera zadnej liczby?
czyli:
in:
3 (pusto)
out:
-

Jeżeli odpowiedź na to pytanie jest przecząca to poproszę Was o sugestie (testy bądź krytykę :wink: ) dotyczące kodu:

kod usuniety

Dzięki z góry za pomoc.

treść zadania tego nie wyklucza - zrób test na takie zdarzenie :slight_smile:

3 months later
6 months later

Zadanko nie chce mi uparcie przejść do AC, a dyskusja i podpowiedzi w tym wątku powyżej nie pomogły mi rozwiązać problemu.
https://ideone.com/nG262936
Wczytuje GETLINEm wszystko do STRINGA a potem szukam spacji i minusow i tworzę z tego tablice liczb.
Zadanie jest w kategorii łatwe wiec nie podejrzewam żeby sędzia sprawdzał liczby nie mieszczące się w LONG LONG, ale nie mam pomysłu co jeszcze innego może być źle.

Może zamiast wymyślać niezwykłe powody niezaliczenia zadania, przeczytaj uważnie treść zadania, może nawet lepiej kilka razy :slight_smile:

a potem doprowadź program do takiego stanu, aby dawał poprawną odpowiedź dla danych testowych z zadania

Zapominałem dopisać że w pierwszej wersji nie wiedziałem jeszcze jak program ma się zatrzymać i robiłem to ręcznie - po wpisaniu linii danych wciskałem CTRL+Z i jeszcze Enter.
Wtedy pierwsza wersja pokaże poprawny wynik. Zapomniałem o tym napisać
Jak pisałem tę pierwszą wersję jeszcze nie wiedziałem jak wprowadzić nieznaną ilość razy, nieznaną ilość danych, bo się uczę dopiero programować.
Potem podpatrzyłem jeden z linków w tej dyskusji i zrobiłem jak w nim, czyli wczytanie z Getline i rzutowanie na long long i dzięki temu w drugiej wersji jest już OK możesz wprowadzać dane i od razu po Enterze jest wynik, mam prośbę więc o zerknięcie i wychwycenie błędu w drugiej wersji.
Pierwsza wersję dla porządku usuwam.

co jest źle w drugiej wersji, jest dla mnie widoczne od razu, ale już znalezienie przykładu prezentującego błąd nie było łatwe :slight_smile:

metodą prób udało mi się znaleźć taki (tu był link do przykładu z błędnym wynikiem)

Jeśli to było dla Ciebie widoczne od razu to gratuluję wprawy, ja musiałem się chwilę pozastanawiać że chodzi o liczenie ujemnych z pozycji minusów.
Nawet mogę napisać że wiem czemu tu popełniłem błąd. Uparłem się żeby skończyć zadanko za jednym posiedzeniem późno wieczorem jak już byłem zmęczony i na sam koniec się zorientowałem że zapomniałem zrobić algorytmu do liczenia ujemnych i na szybko go dopisałem, ale program nie zadziałał nadal.
Następnego dnia już zapomniałem że te minusy pisałem na szybko i nie sprawdzałem już dokładnie ich liczenia i kłopoty gotowe. Przestroga żeby nie programować na siłę jak się jest już zmęczonym.
Dzięki za pomoc.

Chyba na roflcopterze znalazłem ciekawy przykład kodu źródłowego:

bla bla bla //mozna to bylo zrobic ladniej, ale juz po 17

Programowanie wymaga wypoczętego umysłu :wink:

bo (nawet dobre) uwzględnienie liczb ujemnych nie mogło mieć znaczenia - w danych testowych tego zadania nie ma ani jednego minusa :slight_smile:

zaś złe dodało dodatkowy błąd

zaś generalnie musisz popracować nad optymalizacją kodu - znaczna część kodu w tym zadaniu jest niepotrzebna a większość tego co by zostało można znacznie poprawić

1 year later

Mam taki kod z użyciem <set>

[https://ideone.com/p8JoNr25]

Z tego co widzę dane do set mam wpisane poprawnie. Chciałbym iterować wstecz aż do wymaganej pozycjii. Jednak wychodzą mi głupoty.
Podpowie ktoś poprawnie iterować?
Thx

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