http://www.naukowiec.org/wiedza/matematyka/rownanie-prostej-przechodzacej-przez-dwa-punkty_1925.html20
To jest przykład dla dwóch punktów, sam rozpisałem to sobie dla trzech.
Mam pytanie czy ktoś mógłby mi wskazać gdzie popełniam błąd bo testy nie są prawidłowe?
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)
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");
}
}
}
}
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
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.
Niestety to za mało. Podesłać oczywiście bardzo chętnie zobaczę działające rozwiązanie
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
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.
Nie jest tu tak do końca jak by się wydawało, ale może kiedyś to rozwinę.
Możliwe, że trzeba więcej zmienić, bo wprowadzałem różne zmiany i może wszystkie one po trochu poprawiły wynik. Wysyłam Ci więc twój poprawiony na AC kod - może nie najlepszy. [na pryw]. Wydaje mi się, że takie parsowanie na int też nie jest najefektywniejsze - ale ja ani nie znam, ani nie używam javy.
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 185 | Feb 1 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 147 | Apr 2 |
SPOJ.com - Problem ZABAWA pl.spoj.com | Zbiór zadań | 6 | 122 | Jun 23 |