• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Współliniowość punktów

Object Storage Arubacloud
0 głosów
228 wizyt
pytanie zadane 18 kwietnia 2023 w C i C++ przez polandonion Mądrala (7,040 p.)

Siema, dostałem zadanko i zauważyłem, że po prostu trzeba sprawdzić, czy wszystkie punkty są współliniowe. Niestety program nie przechodzi 3 testów, które sprawiają, że program ten otrzymuje 0% w końcowej ocenie. Pomoże ktoś?

Treść: link

Wyniki: link

#include <iostream>

using namespace std;

struct Pkt {
	long long x, y;
};

Pkt a[1000000];

long long ilo(Pkt P, Pkt A, Pkt B) {
	return ((A.x-P.x)*(B.y-P.y) -
			(B.x-P.x)*(A.y-P.y));
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int n;
	cin >> n;

	for (int i = 0; i < n; i ++)
		cin >> a[i].x >> a[i].y;

	for (int i = 2; i < n; i ++) {
		if (ilo(a[0], a[1], a[i]) != 0) {
			cout << "NIE";
			return 0;
		}
	}

	cout << "TAK";
}

 

2 odpowiedzi

+1 głos
odpowiedź 18 kwietnia 2023 przez Whistleroosh Maniak (56,980 p.)
wybrane 19 kwietnia 2023 przez polandonion
 
Najlepsza
Co gdy a[0] == a[1]?
komentarz 19 kwietnia 2023 przez polandonion Mądrala (7,040 p.)
co sugerujesz?

iloczyn wektorowy działa i dla takiego przypadku
komentarz 19 kwietnia 2023 przez Whistleroosh Maniak (56,980 p.)
4
0 0
0 0
0 1
1 0

 

komentarz 19 kwietnia 2023 przez polandonion Mądrala (7,040 p.)

dzięki za znalezienie testu, dla którego mój program działa wadliwie. Poprawiłem go w taki sposób, że dopóki dwa pierwsze punkty są takie same, to wywalam pierwszy i dalej sprawdzam wg. tego samego schematu, czyli dwa pierwsze punkty z i-tym.

Program działa w O(n), ale czasy są zbyt wysokie... Możliwe jest przyspieszenie programu, czy po prostu nauczyciel si pomylił dając zbyt krótkie limity?

#include <iostream>

using namespace std;

struct Pkt {
	long long x, y;

	bool operator == (const Pkt &pkt) const {
		return (x == pkt.x and y == pkt.y);
	}
};

Pkt a[1000000];

long long ilo(Pkt P, Pkt A, Pkt B) {
	return ((A.x-P.x)*(B.y-P.y) -
			(B.x-P.x)*(A.y-P.y));
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int n;
	cin >> n;

	for (int i = 0; i < n; i ++)
		cin >> a[i].x >> a[i].y;

	int l = 0;
	while (l + 1 < n and a[l] == a[l + 1])
		l ++;

	for (int i = l + 2; i < n; i ++) {
		if (ilo(a[l], a[l + 1], a[i]) != 0) {
			cout << "NIE";
			return 0;
		}
	}

	cout << "TAK";
}

 

1
komentarz 19 kwietnia 2023 przez Whistleroosh Maniak (56,980 p.)
Ogólnie dziwna sprawa. O(n) dla n <= 1e6 powinno wykonać się dużo szybciej niż sekunde. To powinno już wejść na 100
0 głosów
odpowiedź 19 kwietnia 2023 przez manjaro Nałogowiec (37,390 p.)
Gdzie można sprawdzić swój kod?

Trzeba sprawdzić współczynnik kierunkowy prostej przechodzącej przez 2 punkty. Dla n punktów będzie to n-1 współczynników.

Sprawdzania zaczynamy od n=3 punktów, dla mniejszej ilości będzie odpowiedź "TAK".
komentarz 19 kwietnia 2023 przez polandonion Mądrala (7,040 p.)
zadanko nie jest na szkopule tylko na szkolnej platformie. jak chcesz moge wyslac teoj kod i ci powiedziec jak testy, mam nieskonczonosc wyslan.

co do algorytmu to stosuje tutaj iloczyn wektorowy i w taki sposób sprawdzam współliniowość. wyliczanie współczynnika a dałoby te same efekty
komentarz 19 kwietnia 2023 przez polandonion Mądrala (7,040 p.)
ale ogólnie kilka razy zawiodłem się na dokładności float'ów, więc no...
komentarz 20 kwietnia 2023 przez Oscar Nałogowiec (29,320 p.)
A jest tam choć jeden float?

Podobne pytania

0 głosów
1 odpowiedź 415 wizyt
0 głosów
0 odpowiedzi 448 wizyt
pytanie zadane 27 listopada 2016 w Algorytmy przez ProgramistaStepek Nałogowiec (27,020 p.)
0 głosów
2 odpowiedzi 388 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...