9 / 9
Jan 2019

Cześć wszystkim :wink:,

Próbuję wykonać zadanie: http://pl.spoj.com/problems/VSR/21 .
Oto mój kod: http://ideone.com/kBhOpH45 .

Do rozwiązania tego zadania 'Scanner' jest za wolny. dlatego użyłem 'BufferedReader', jednak bez ujęcia kodu w 'exception' program zwracał błąd NZEC.

Teraz kiedy próbuję podać to rozwiązanie, sędzia SPOJ zwraca mi rezultat "błędna odpowiedź".
Próbowałem również sposobu żeby przyjąć liczbę jako String, a dopiero potem ją przekonwertować, nie pomaga..

Czy ktoś może mi tu poradzić rozwiązanie?
Oczywiście nie muszę dodawać, że jestem początkujący w Javie :slight_smile:

Z góry dzięki :slight_smile:

  • created

    Jun '17
  • last reply

    Jan '19
  • 8

    replies

  • 1.7k

    views

  • 4

    users

  • 4

    likes

  • 12

    links

Tak, zauważyłem to również, ale w 'IntelliJ IDEA' dobrze działa(zwraca wartości), błędów w kodzie nie widzę, przynajmniej na swój poziom znajomości Javy. Dlatego nie wiem w jaki sposób mogę to rozwiązać.
'Scanner' za wolny, chciałem na 'BufferedReader', ale skoro nie w sposób, jaki zastosowałem w kodzie to czy ktoś może doradzić w jaki inny (wydaje mi się, że tylko 'BufferedReader' wchodzi w grę)?

Najpierw zrób tak, żeby kod działał w prawidłowy sposób, a dopiero potem martw się czy jest wystarczająco szybki. To że działa Ci w twojej ide'a jest bez znaczenia. Gdyby dane były podawane w poniższy sposób, jedna linia jedna dana [liczba], twój kod zadziałałby, ale przecież nie tak są podawane: http://ideone.com/hzzUXf19

To, że wyłapujesz wszelkie błędy [try{ } catch] i przy jakimkolwiek program kończy działalność, powoduje i na SPOJu i na ideone brak [pusty] stodout i nie widzisz, że program jest błędny - błędnie wczytujesz dane.

Dzieje się tak dlatego, że źle wczytujesz dane. Masz w jednej linii dwie zmienne (np. 50 50), a Ty czytasz readline czyli całą linię "50 50" do stringa i później rzutujesz to na int1. Jak myślisz... czym będzie int1? Przecież nie da się zrzutować "50 50" na int. Spróbuj poniższym sposobem:

int a[] = new int[2];
String line = br.readLine();
String[] strs = line.trim().split("\\s+");
for (int i = 0; i < 2; i++) {
    a[i] = Integer.parseInt(strs[i]);
}

to tylko sposób na przeczytanie dwóch liczb z jednej linii. Z resztą musisz sobie poradzić sam.

Edit: I @narbej mnie trochę ubiegł :slight_smile:

Dziękuję Wam za cenne uwagi, oczywiście działa powyższym sposobem na 'BufferedReader' bez błędów, ale teraz SPOJ nie przyjmuję z uwagi na za przekroczony limit czasu.

Oto mój kod: http://ideone.com/kHeKmm33

Wiem, że są 'liczniki', które wstawia się w kod aby zmierzyć czas programu, działałem na nich, nie są też zbyt dokładne. Czy są bardziej precyzyjne sposoby, aby zmierzyć czas programu na poziomie sędziego SPOJ? Strony jak Ideone testujące m.in stdin.

Nie będzie łatwo wykorzystanego sposobu dla 'BufferedReader' jeszcze bardziej zawęzić, a nawet nie wiem ile dokładnie mi brakuje żeby zmieścić się w tym czasie 0.100s.

To była tylko podpowiedź jak wczytywać dane z jednej linijki. Bardzo źle, że przepisałeś ją żywcem bez dostosowania. Czy na prawdę potrzebujesz tablicy intów i pętli? Czy musisz deklarować zmienne w pętli (to zwalnia), a nie możesz poza nią? Czym jest argument metody split? Może da się go zapisać prościej niż \\s+? Ja po przerobieniu tych trzech rzeczy dostałem AC.

Jeżeli to Ci nie pomoże to masz StringTokenizer zamiast splita: https://cpe.ku.ac.th/~jim/java-io.html14
Poza tym można napisać własny konwerter string -> int: http://codeforces.com/blog/entry/68347
A zamiast BufferedReader przyjrzeć się Console: https://stackoverflow.com/questions/33506302/what-are-the-fast-ways-to-take-input-in-java25

I to: http://www.codejava.net/java-se/file-io/3-ways-for-reading-input-from-the-user-in-the-console14

Inna sprawa, że Java jest wolna w operacjach wejścia/wyjścia. Ale jak napisałem... zmieniając tylko te trzy rzeczy dostałem AC: http://pl.spoj.com/status/VSR,redysz/26

Ok rozumiem, jasne, że można inaczej to wykonać, będę kombinował. Bardzo dzięki za wszystkie informacje i pozdrawiam.

1 year later

Szanowni Państwo,

jestem bardzo poczatkujacym, ale mam w planach przejsc wszystkie testy:smiley:
Nie mnie jednak początki bywają trudne i ponownie potrzebuję pomocy.

Oczywiscie na eclise dziala, o dziwo na Ideone, a sedzie mowi ze przekraczam limit czasu. Uzywam juz BufferedReader, oraz korzystam z rozwiazania podanego wyzej. Niestety nie mam pomyslu jak to przyspieszczyc.

moj kod:
AC

@narbej, bez try-catch sa bledy dla BufferedReader’a. Na szczescie udalo mi sie przejsc, przy kosmetycznych zmianach z ifami.