1 / 133
Oct 2015

Na przykladowych testach i na moich testach program dziala w 100%.
Niestety SPOJ zwraca komunikat BŁEDNA ODPOWIEDŹ.
POMOCY frowning

http://wklej.org/id/1828241/341

  • created

    Oct '15
  • last reply

    Jan '24
  • 132

    replies

  • 5.7k

    views

  • 41

    users

  • 24

    likes

  • 29

    links

Frequent Posters

There are 132 replies with an estimated read time of 14 minutes.

A to jest w tym wypadku jasny i wyraźny sygnał, że powinieneś jeszcze co najmniej raz, dokładnie przeczytać treść zadania.

paskudnie jak ....
Na pocieszenie, wystarczy poprawić tylko dwie rzeczy i AC, chociaż kod nadal będzie bardzo "nieładny".
1.
tu int pom1, a tu float od[n]

2
Dodaj /*' i '*/' w poniższym bloku, w pokazanych miejscach:
/* <- dodaj tu if(tab[0][j]==0&&tab[1][j]==0)od[j]=0;
if(tab[0][j]==0)od[j]=tab[1][j];
if(tab[1][j]==0)od[j]=tab[0][j];
else i dodaj tu -> */
od[j]=sqrt(pow(abs(tab[0][j]),2)+pow(abs(tab[1][j]),2));

Jak poprawisz tylko te dwie rzeczy, będzie AC. Jeżeli chciałbyś jednak wiedzieć, gdzie nadal są paskudy w twoim kodzie, mógłbym ewentualnie popróbować Ci wytłumaczyć.

Co mam konkretnie zrobiv z int pom1 i float od[n]?
btw, dzieki za rady, bylbym wdzieczny gdybys zasugerowal jak powinien kod wygladac zeby byl "ladny" wink

Weź je i pomyśl wink Chciałem to zostawić dla Ciebie, ale ok. Jak myślisz, czy pom1 i tablica nie muszą być tego samego typu? A jakiego, chyba się zastanowisz i będziesz wiedział?

zdazylem to zauwazyc, strasznie glupi blad, anyway dzięki za pomoc

3 months later

Witam, to mój pierwszy post na SPOJ.
Napisałem własną wersję rozwiązania tworząc sortowanie w wersji 'na piechotę' oraz pokazywanie wyniku na samym końcu tzn. po wprowadzeniu wszystkich zestawów. Moje testy wychodzą ok, ale innego 'zdania' jest sędzia SPOJ. Prosiłbym o pomoc, wskazówki. Jestem początkujący w programowaniu co od razu widać po kodzie grimacing

http://wklej.org/id/AC107? [narbej]

11 days later

Ponieważ jest prawie AC, pozwoliłem sobie "trochę uszkodzić link do wklejki. Błąd jest paskudny - dosyć trudny do znalezienia. Podpowiem więc na razie tylko dwie rzeczy. Możliwe, że w twoim środowisku (windows?) przy testowniu jest w miarę ok? Jeżeli tak, to w mainie zakomentuj wywołanie sortowania i wyślij taki "poprawiony" program na SPOJ'a. Już nie będzie SIGABRT ale WA zła odpowiedź. Wniosek - masz skopaną funkcję -procedurę sortowania. SIGABRT to wychodzenie poza przydzielony i dozwolony obszar pamięci.

  1. Podpowiedź II. Kod jak widzę masz starannie napisany, chociaż dostrzegam małe niekonsekwencje. Błędem jest jeden mały, nadmiarowy średnik. Jak go znajdziesz i usuniesz - AC.
    Gdybyś chciał więcej, krytycznych, ale konstruktywnych [mam nadzieję] moich uwag do twojego kodu, napisz.

OK
Dla przypomnienia i dla "potomnych" na czym polegał błąd w twoim kodzie:
Miałeś w funkcji sortowania takie pętle [piszę z pamięci]:

int i, j;
for (i = 0; i < N; ++i); //<== ten średnik to w tym kodzie błąd
   {
  for (j = 0; j < N-1-i; ++j)
   {

I tu od razu niekonsekwencja, o której wcześniej pisałem.
W innych pętlach, używałeś inicjalizacji wewnątrz pętli:
for (int i = 0 ...
Gdybyś zrobił tak, także tutaj, kompilator [przy próbie kompilacji] wypisał by Ci od razu błąd i natychmiast mógłbyś go poprawić.

  1. Nie jestem zwolennikiem nadmiaru nawiasów i wszędzie, gdzie są zbędne usuwam je, zarówno {} jak i ()

  2. Programowanie Obiektowe - tu dopiero raczkujesz, ale ja też wink
    a) zamiast w main() : wsk[j].o=wsk[j].odleglosc(wsk[j].x,wsk[j].y);
    mógłbyś napisać tam [w mainie]: wsk[i].odleglosc(); ale musiałbyś zmienić swoją funkcję w klasie na:
    void odleglosc() {
    o = x*x + y*y; // stosowanie tu funkcji pow() jest niepotrzzebne więc include cmath także jest zbędne
    }

  3. Także pozostałe funkcje, a także tablicę wsk, możnaby i warto włożyć do klasy - ale to kiedyś, sam się nauczysz.

PS
W twoim kodzie miałeś średnik na końcu drugiej pętli, ale to nie zmienia faktu, że był/jest to błąd.
Ja zawsze staram się pisać pętle tak:

for (......) { //tu od razu nawias otwierający gdy potrzebuję nawiasów.
   .....
   .....
   }

PS 2
Po takich poprawkach, po kompilacji, prawdopodobnie nic się nie zmieni w szybkości działania czy tym bardziej w samym działaniu, ale czytelność napewno będzie lepsza.

5 months later

Witam
Siedzę nad tym zadaniem już drugi dzień. Wszystkie ekstremalne testy program zalicza prawidłowo a dostaję komunikat "Błędna odpowiedź. Może ktoś zerknąć?
Podejrzewam że autor ma inny algorytm sortujący i te same odległości może wypisywać w innej kolejności... Ale to byłoby strasznie głupie.
Poniżej mój kod
https://ideone.com/YIPxUf105

Dodatkowo jeszcze prawie 3500 sortuje w głupi sposób :wink: : http://pl.spoj.com/ranks/PP0506A/54

Co jest w twoim kodzie błędne nie wiem- ale przecież już sam znalazłeś, więc warto to napisać. Takie moje uwagi:

  1. Czy nazwanie klasą "TABELA", tego co jest prostą strukturą punktu "PUNKT" nie jest błędem chodzi mi szczególnie o nazwę?
  2. Używanie zmiennych globalnych, gdy można lokalnych.
  3. Bardzo zaawulowane używanie dodatkowego dodanego miejsca w tablicy jako zmiennej tymczasowej.
  4. Używanie własnej procedury sortującej - czy na pewno poprawna - gdy są gotowe w STL.
  5. Używanie zmiennej typu double, gdy do przechowywania odległości [jej kwadratu] wystarczy typ int (max = 2 * 1000^2)
  6. Sędzia jest surowy [program porównujący odpowiedzi z wzorcem] ale jednak najczęściej bardzo wyrozumiały gdy chodzi o nadmiar lub niedobór białych znaków [space, tab, enter] byle był tam chociaż jeden, dowolny z nich, gdy jest niezbędny.
  7. Oczywiście sprawdziłem i nie ma pkt w identycznej odległości.

Dziękuję za odpowiedź. Rozumiem że mój kod nie jest piękny stylistycznie ale jakby nie było liczył poprawnie. Błędu nie znalazłem ale zmieniłem sortowanie quicksortem na sort() i teraz program przechodzi. Dlaczego tak jest nie wiem. W każdym razie miałem zaimplementowany normalny algorytm quicksort, który dawał mi poprawne odpowiedzi przy wszystkich testach jakie znalazłem.

Jeżeli Twój kod nie dostał AC to znaczy, że jednak gdzieś jest błąd. Trudny do znalezienia, ale na pewno obecny. W gruncie rzeczy może być wszędzie - jak zauważył narbej, Twój kod jest strasznie zawiły i nie trudno w nim o pomyłkę dla jakiegoś dzikiego testu. Ja dostałem AC pisząc własne sortowanie bąbelkowe. Chyba wyczytałem na forum, że to wystarczy.

Ciekawostka! Raczkowałem wtedy w obiektówce i stworzyłem takie coś:

struct pkt {
public:
   string str;
   int x,y,o,i; 
};

Widzę tu w najlepszym przypadku lukier składniowy na literę p a w najpewniejszym dowód niewiedzy programisty :wink:

moje rady:

1) okulista
2) więcej testów, np.:

1
9
a 3 30
b 3 40
c 3 50
d 2 7
e 2 6
f 2 5
g 1 300
h 1 200 
i 1 100

3) jakiś rozsądny podręcznik z C++
4) w przyszłości przekazywanie kodu przez ideone.com
5) nie nadużywanie first i second bo czytelność kodu zerowa

Od siebie dodam tylko, że o 3) jest sporo w odpowiednim dziale na forum oraz, że w przypadku 5) znam rygorystycznego człowieka, który unika pair zawsze gdy tylko jest to możliwe i łatwe do osiągnięcia - w miarę możliwości zawsze tworzy struktury, których składowe będą jasno mówiły o co chodzi.