1 / 21
Jul 2017

Witam

Rozwiązuje zadanie JWSPLIN i dostaję błąd NZEC. Sprawdziłem kod na Ideone.com i przechodzi bez problemu. Ktoś potrafiłby mi pomóc? Serdecznie dziękuje
Ideone: http://ideone.com/xHKlnj7

  class JWSPLIN {

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int t = Integer.parseInt(br.readLine());
    String input[];
    int x,y,x1,y1,x2,y2,score;
    while(t-->0){
        score = 0;
        input = br.readLine().trim().split(" ");
        x = Integer.parseInt(input[0]);
        y = Integer.parseInt(input[1]);
        x1 = Integer.parseInt(input[2]);
        y1 = Integer.parseInt(input[3]);
        x2 = Integer.parseInt(input[4]);
        y2 = Integer.parseInt(input[5]);
        score = x * y1 + x1 * y2 + y * x2 - y1 * x2 - x * y2 - y * x1;
        if(score==0){
            System.out.println("TAK");
        }else{
            System.out.println("NIE");
        }
    }
}
}

Mój kod kopiowałem do Spoja z klasą Main. Niestety błąd jest taki sam.

Twój poprzedni kod po zmianie jednego znaku dostał AC.
cytat z treści zadania "Kolejne współrzędne oddzielone są znakiem tabulacji. "
ten znak to "\t"

Przepraszam czy autor tematu mógłby podać skąd wziął wzór na współlinowość trzech punktów. Skąd to się bierze:
x * y1 + x1 * y2 + y * x2 - y1 * x2 - x * y2 - y * x1 ?

2 years later

Mam pytanie czy ktoś mógłby mi wskazać gdzie popełniam błąd bo testy nie są prawidłowe?:roll_eyes:

public class WspółliniowośćPunktów {

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);

    int ile = s.nextInt();
    int t[] = new int[10];

    for (int i = 0; i < ile; i++) {
        t[i] = s.nextInt();
        int x = t[0];
        int y = t[1];
        int x1 = t[2];
        int y1 = t[3];
        int x2 = t[4];
        int y2 = t[5];

        int sum = x * y1 + x1 * y2 + y * x2 - y1 * x2 - x * y2 - y * x1;

        if (sum == 0) {
            System.out.println("TAK");
        } else {
            System.out.println("NIE");
        }
    }
}

}

Wcześniejszy kod który dawał poprawne wyniki (ale został przekroczony limit czasu) :slightly_smiling_face:

class Main {
public static void main(String[] args) throws java.lang.Exception {
    Scanner s = new Scanner(System.in);
    int ile = s.nextInt();
    for (int i = 0; i <= ile; i++) {
        int x = s.nextInt();
        int y = s.nextInt();
        int x1 = s.nextInt();
        int y1 = s.nextInt();
        int x2 = s.nextInt();
        int y2 = s.nextInt();

        int sum = x * y1 + x1 * y2 + y * x2 - y1 * x2 - x * y2 - y * x1;

        if (sum == 0) {
            System.out.println("TAK");
        } else {
            System.out.println("NIE");
        }
    }
}

}

2 years later

Testowałem na ideone wielokrotnie wersję ze Scanner oraz BufferedReader. Jak wiadomo to drugie rozwiązanie jest szybsze. Jednak po naprawdę wielu kombinacjach (for, while, parseInt, parseShort) i wielu uruchomieniach czas dla Scannera 0.13, a dla BufferedReader 0.9 lub 1.0 (raz 0.15). Dla 5 linijek (przykładowe wejście). Nie znalazłem w zgłoszonych rozwiązaniach prawidłowego na Java.
Według mnie w tak krótkim czasie nie jest możliwe napisanie tego w Javie. Moje pierwsze rozwiązanie było w ogóle na ArrayList<Point>, ale po komunikacie “Przekroczono limit czasu” zacząłem się cofać do coraz bardziej prymitywnych rozwiązań. Nie udało się. Napisałem to samo w C++ i wykonuje się w czasie 0.0 (już na spoju). Autor przegiął z czasem i tyle.
Jeśli jestem w błędzie proszę o informacje :slight_smile:

Tak, jesteś w błędzie.
Powinieneś jeszcze raz, dokładnie przeczytać treść zadania.
Jeżeli to nie pomoże to przeczytaj, nie przelać po łebkach, ten wątek.
A w ostateczniści pokaż swój kod.

Bardzo dziękuję za odpowiedź :slight_smile: Chyba trzeba dalej drążyć temat :slight_smile: :slight_smile: :slight_smile:

Pisząc o czytaniu, miałem na myśli informacje o rozdzieleniu danych znakiem tabulacji.
Możliwe, że twoje użycie metody .split("\\s+"), jest poprawne, ale chyba jest za wolne.
Spróbuj użyć po prostu: .split("\t")
W innych językach można zastosować gołe [bez parametru] split() i działa, niestety w javie trzeba podać konkretnie [i tu wygląda, że krótko].

PS
Dodatkowo.
Nie przyśpieszy, ale można zrezygnować z metody trim(). Jest w tym wypadku całkowicie zbędna.

Można też trochę skrócić kod, wprawdzie bez wpływu na szybkość, ale … Jak chcesz, mogę Ci podesłać na priv moje wypociny.

https://pl.spoj.com/status/JWSPLIN,narbej/3

To znaczy nie \\s+ ale \t

Niestety to za mało. Podesłać oczywiście :slight_smile: bardzo chętnie zobaczę działające rozwiązanie :slight_smile: W ogóle bez sensu jest połączenie Javy i tego zadania (z ograniczeniem czasu). Skoro jest klasa Point2D i Interfejs Collection to po co komplikować sprawę. Żeby było szybko trzeba być jak najbliżej sprzętu, a Java jest daleko :slight_smile: Napisałem to w cpp, a rozwiązania w Java działają tylko są wolniejsze. Chyba trzeba odpuścić temat. W sumie zacząłem pisać w Java żeby nie wyważać otwartych drzwi.