{"id":"informatyka-2018-maj-matura-rozszerzona/zad/2.1","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"2.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Zadanie 2.1. (0-2)\nNapisz algorytm (w pseudokodzie lub wybranym języku programowania), który znajdzie i poda\nwspółrzędne skrajnie lewego szczytu, tzn. widocznego dla obserwatora na lewo od wszystkich\npozostałych szczytów.\nSpecyfikacja:\nDane:\nn\n- liczba całkowita dodatnia\nX[1 n] - tablica liczb całkowitych\nY[1 n] - tablica liczb całkowitych dodatnich\nPara (X[i], Y[i]) to współrzędne jednego szczytu, i = 1, 2, …, n.\nŻadne dwa szczyty nie leżą w jednej linii z obserwatorem.\nWynik:\nx, y - współrzędne skrajnie lewego szczytu spośród tych opisanych w tablicach X i Y.\nAlgorytm\nWypełnia\negzaminator\nNr zadania\n2.1.\nMaks. liczba pkt.\n2\nUzyskana liczba pkt.\nMIN_1R","answer":null,"answer_text":"Zadanie 2.1. (0-2)\nWymagania ogólne\nWymagania szczegółowe\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […] z zastosowaniem\npodejścia algorytmicznego.\n5. Rozwiązywanie problemów\ni podejmowanie decyzji […], stosowanie\npodejścia algorytmicznego.\nZdający:\n1) analizuje, modeluje i rozwiązuje sytuacje\nproblemowe z różnych dziedzin;\n2) stosuje podejście algorytmiczne do\nrozwiązywania problemu;\n4) dobiera efektywny algorytm do\nrozwiązania sytuacji problemowej\ni zapisuje go w wybranej notacji;\n5) posługuje się podstawowymi technikami\nalgorytmicznymi;\n11) opisuje podstawowe algorytmy\ni stosuje:\nb) algorytmy wyszukiwania\ni porządkowania (sortowania), np.:\n- jednoczesne znajdowanie największego\ni najmniejszego elementu w zbiorze:\nalgorytm naiwny i optymalny,\n- algorytmy sortowania ciągu liczb:\nbąbelkowy, przez wybór, przez wstawianie\nliniowe lub binarne, przez scalanie, szybki,\nkubełkowy.\nSchemat punktowania\n2 p. - za poprawny algorytm, w tym:\n1 p. - za prawidłową inicjalizację oraz konstrukcję pętli,\n1 p. - za zastosowanie prawidłowego porównania oraz wyznaczenie współrzędnych\nskrajnie lewego szczytu,\nUwaga: za prawidłowe porównanie i wyznaczenie poprawnej najmniejszej wartości ilorazu\nwspółrzędnych oraz poprawnego indeksu - 1 punkt,\n0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.\nPrzykładowe rozwiązanie\nk ← 1\ndla i = 2, 3, , n wykonuj\njeżeli X[i]/Y[i] < X[k]/Y[k]\nk ← i\nx ←X[k], y←Y[k]","solution":"## Poprawna odpowiedź\n\n**Algorytm (pseudokod):**\n\nk ← 1\ndla i = 2, 3, , n wykonuj:\njeżeli X[i]/Y[i] < X[k]/Y[k]:\nk ← i\nx ← X[k]\ny ← Y[k]\n\nLub równoważnie (bez dzielenia, uważając na znak Y[i] > 0):\nk ← 1\ndla i = 2, 3, , n wykonuj:\njeżeli X[i] * Y[k] < X[k] * Y[i]:\nk ← i\nx ← X[k]\ny ← Y[k]\n\n## Sposób 1 - analiza problemu i klasyczny algorytm znajdowania minimum\n\n**Idea:** szczyt jest \"widoczny na lewo\" gdy ma najmniejszą wartość ilorazu `X[i]/Y[i]`. Szukamy więc **MINIMUM** spośród wszystkich ilorazów `X[i]/Y[i]`.\n\nAlgorytm to standardowe **wyszukiwanie minimum** w tablicy z modyfikacją w warunku porównania:\n1. Załóżmy, że minimum jest na pozycji 1 (k = 1).\n2. Iterujemy i od 2 do n.\n3. Jeśli iloraz pozycji i jest mniejszy niż na pozycji k → aktualizujemy k = i.\n4. Po pętli zwracamy współrzędne (X[k], Y[k]).\n\n## Sposób 2 - implementacja Python\n\n```python\ndef skrajnie_lewy(X, Y):\nn = len(X)\nk = 0 # indeks od 0 w Python\nfor i in range(1, n):\nif X[i] / Y[i] < X[k] / Y[k]:\nk = i\nreturn X[k], Y[k]\n\n# Przykład: D(-2,2), A(1,3), B(3,4), C(2,1)\nX = [-2, 1, 3, 2]\nY = [2, 3, 4, 1]\nprint(skrajnie_lewy(X, Y)) # (-2, 2) - szczyt D\n\n**Weryfikacja na przykładzie:**\n- D: -2/2 = **-1.0** (najmniejszy)\n- A: 1/3 ≈ 0.333\n- B: 3/4 = 0.75\n- C: 2/1 = 2.0\n\nMinimum = -1.0 → D ✓\n\n## Sposób 3 - C++ / Pascal\n\n**C++ (bezpieczna wersja bez dzielenia float):**\n```cpp\nvoid skrajnieLewy(int X[], int Y[], int n, int& x, int& y) {\nint k = 0;\nfor (int i = 1; i < n; i++) {\n// X[i]/Y[i] < X[k]/Y[k] <=> X[i]*Y[k] < X[k]*Y[i] (Y[i], Y[k] > 0)\nif ((long long)X[i] * Y[k] < (long long)X[k] * Y[i]) {\nk = i;\n}\n}\nx = X[k]; y = Y[k];\n}\n\n**Pascal:**\n```pascal\nprocedure SkrajnieLewy(X, Y: array of LongInt; n: Integer; var x, y: LongInt);\nvar i, k: Integer;\nbegin\nk := 0;\nfor i := 1 to n - 1 do begin\nif X[i] * Y[k] < X[k] * Y[i] then k := i;\nend;\nx := X[k]; y := Y[k];\nend;\n\n## Reference informatyczny - wyszukiwanie minimum\n\n> Reference - Wyszukiwanie minimum w tablicy:\n> - Klasyczny algorytm O(n) z jedną zmienną przechowującą bieżące minimum.\n> - Inicjalizacja: minimum = pierwszy element. Iteracja: porównanie z pozostałymi.\n> - Tutaj funkcja porównująca to `X[i]/Y[i]`, czyli **funkcja klucza** (analogicznie do `key=` w Python `min()`).\n>\n> Reference - Porównanie ilorazów bez dzielenia:\n> - `a/b < c/d` ⟺ `a·d < c·b` (gdy b, d > 0).\n> - Zaleta: brak błędów zaokrąglenia floating-point.\n> - Wada: ryzyko przepełnienia int (gdy `a·d` duże). W zadaniu Y > 0 zawsze, więc bezpiecznie.\n>\n> Reference - Interpretacja geometryczna:\n> - Iloraz X/Y to **kąt nachylenia** linii od obserwatora (0,0) do punktu (X, Y).\n> - Im mniejszy iloraz (ujemny dla X<0), tym bardziej w lewo.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.1, max 2 pkt):\n> - **1 pkt** za prawidłową inicjalizację (k = 1) ORAZ poprawną pętlę (dla i = 2, , n)\n> - **1 pkt** za prawidłowe porównanie (X[i]/Y[i] < X[k]/Y[k]) ORAZ wyznaczenie wyniku (x, y)\n> - **0 pkt** - odpowiedź błędna lub brak\n\n## Typowe pułapki\n\n- **Inicjalizacja k = 0** - w pseudokodzie CKE indeks startowy to 1, nie 0.\n- **Wyszukiwanie maksimum** zamiast minimum - szczyt skrajnie LEWY to NAJMNIEJSZY iloraz X/Y.\n- **Porównanie bezpośrednie X[i] < X[k]** - zła interpretacja \"lewo\" jako najmniejsze X. Trzeba uwzględnić Y.\n- **Zwracanie indeksu** zamiast współrzędnych - pytanie pyta o (x, y), nie o k.\n- **Float vs integer division** - w Pascal `/` zwraca Real, w C++ trzeba uważać przy int. Bezpieczniej mnożyć skrośnie.\n- **Pominięcie warunku Y > 0** - w zadaniu Y jest dodatnie (z definicji), więc krzyżowe mnożenie bezpieczne.\n\n## Złożoność obliczeniowa\n\n- Jedno przejście przez tablicę: **O(n)** porównań.\n- Pamięć: **O(1)** dodatkowa (tylko zmienna k).\n- **Optymalne** - nie da się znaleźć minimum w mniej niż O(n) (każdy element trzeba sprawdzić).","image":"img/informatyka-2018-maj-matura-rozszerzona/zad-2.1.webp","solution_image":null,"topics":null,"page_from":5,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2018 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 2.1. (0-2)<br>Napisz algorytm (w pseudokodzie lub wybranym języku programowania), który znajdzie i poda<br>współrzędne skrajnie lewego szczytu, tzn. widocznego dla obserwatora na lewo od wszystkich<br>pozostałych szczytów.<br>Specyfikacja:<br>Dane:<br>n</p>\n<ul><li>liczba całkowita dodatnia</li></ul>\n<p>X[1 n] - tablica liczb całkowitych<br>Y[1 n] - tablica liczb całkowitych dodatnich<br>Para (X[i], Y[i]) to współrzędne jednego szczytu, i = 1, 2, …, n.<br>Żadne dwa szczyty nie leżą w jednej linii z obserwatorem.<br>Wynik:<br>x, y - współrzędne skrajnie lewego szczytu spośród tych opisanych w tablicach X i Y.<br>Algorytm<br>Wypełnia<br>egzaminator<br>Nr zadania<br>2.1.<br>Maks. liczba pkt.<br>2<br>Uzyskana liczba pkt.<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 2.1. (0-2)<br>Wymagania ogólne<br>Wymagania szczegółowe<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji […] z zastosowaniem<br>podejścia algorytmicznego.</p>\n<ol><li>Rozwiązywanie problemów</li></ol>\n<p>i podejmowanie decyzji […], stosowanie<br>podejścia algorytmicznego.<br>Zdający:</p>\n<ol><li>analizuje, modeluje i rozwiązuje sytuacje</li></ol>\n<p>problemowe z różnych dziedzin;</p>\n<ol><li>stosuje podejście algorytmiczne do</li></ol>\n<p>rozwiązywania problemu;</p>\n<ol><li>dobiera efektywny algorytm do</li></ol>\n<p>rozwiązania sytuacji problemowej<br>i zapisuje go w wybranej notacji;</p>\n<ol><li>posługuje się podstawowymi technikami</li></ol>\n<p>algorytmicznymi;</p>\n<ol><li>opisuje podstawowe algorytmy</li></ol>\n<p>i stosuje:<br>b) algorytmy wyszukiwania<br>i porządkowania (sortowania), np.:</p>\n<ul><li>jednoczesne znajdowanie największego</li></ul>\n<p>i najmniejszego elementu w zbiorze:<br>algorytm naiwny i optymalny,</p>\n<ul><li>algorytmy sortowania ciągu liczb:</li></ul>\n<p>bąbelkowy, przez wybór, przez wstawianie<br>liniowe lub binarne, przez scalanie, szybki,<br>kubełkowy.<br>Schemat punktowania<br>2 p. - za poprawny algorytm, w tym:<br>1 p. - za prawidłową inicjalizację oraz konstrukcję pętli,<br>1 p. - za zastosowanie prawidłowego porównania oraz wyznaczenie współrzędnych<br>skrajnie lewego szczytu,<br>Uwaga: za prawidłowe porównanie i wyznaczenie poprawnej najmniejszej wartości ilorazu<br>współrzędnych oraz poprawnego indeksu - 1 punkt,<br>0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.<br>Przykładowe rozwiązanie<br>k ← 1<br>dla i = 2, 3, , n wykonuj<br>jeżeli X[i]/Y[i] &lt; X[k]/Y[k]<br>k ← i<br>x ←X[k], y←Y[k]</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Algorytm (pseudokod):</strong></p>\n<p>k ← 1<br>dla i = 2, 3, , n wykonuj:<br>jeżeli X[i]/Y[i] &lt; X[k]/Y[k]:<br>k ← i<br>x ← X[k]<br>y ← Y[k]</p>\n<p>Lub równoważnie (bez dzielenia, uważając na znak Y[i] &gt; 0):<br>k ← 1<br>dla i = 2, 3, , n wykonuj:<br>jeżeli X[i] * Y[k] &lt; X[k] * Y[i]:<br>k ← i<br>x ← X[k]<br>y ← Y[k]</p>\n<h4>Sposób 1 - analiza problemu i klasyczny algorytm znajdowania minimum</h4>\n<p><strong>Idea:</strong> szczyt jest &quot;widoczny na lewo&quot; gdy ma najmniejszą wartość ilorazu <code>X[i]/Y[i]</code>. Szukamy więc <strong>MINIMUM</strong> spośród wszystkich ilorazów <code>X[i]/Y[i]</code>.</p>\n<p>Algorytm to standardowe <strong>wyszukiwanie minimum</strong> w tablicy z modyfikacją w warunku porównania:</p>\n<ol><li>Załóżmy, że minimum jest na pozycji 1 (k = 1).</li><li>Iterujemy i od 2 do n.</li><li>Jeśli iloraz pozycji i jest mniejszy niż na pozycji k → aktualizujemy k = i.</li><li>Po pętli zwracamy współrzędne (X[k], Y[k]).</li></ol>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>def skrajnie_lewy(X, Y):<br>n = len(X)<br>k = 0 # indeks od 0 w Python<br>for i in range(1, n):<br>if X[i] / Y[i] &lt; X[k] / Y[k]:<br>k = i<br>return X[k], Y[k]</p>\n<h3>Przykład: D(-2,2), A(1,3), B(3,4), C(2,1)</h3>\n<p>X = [-2, 1, 3, 2]<br>Y = [2, 3, 4, 1]<br>print(skrajnie_lewy(X, Y)) # (-2, 2) - szczyt D</p>\n<p><strong>Weryfikacja na przykładzie:</strong></p>\n<ul><li>D: -2/2 = <strong>-1.0</strong> (najmniejszy)</li><li>A: 1/3 ≈ 0.333</li><li>B: 3/4 = 0.75</li><li>C: 2/1 = 2.0</li></ul>\n<p>Minimum = -1.0 → D ✓</p>\n<h4>Sposób 3 - C++ / Pascal</h4>\n<p><strong>C++ (bezpieczna wersja bez dzielenia float):</strong><br>```cpp<br>void skrajnieLewy(int X[], int Y[], int n, int&amp; x, int&amp; y) {<br>int k = 0;<br>for (int i = 1; i &lt; n; i++) {<br>// X[i]/Y[i] &lt; X[k]/Y[k] &lt;=&gt; X[i]<em>Y[k] &lt; X[k]</em>Y[i] (Y[i], Y[k] &gt; 0)<br>if ((long long)X[i] * Y[k] &lt; (long long)X[k] * Y[i]) {<br>k = i;<br>}<br>}<br>x = X[k]; y = Y[k];<br>}</p>\n<p><strong>Pascal:</strong><br>```pascal<br>procedure SkrajnieLewy(X, Y: array of LongInt; n: Integer; var x, y: LongInt);<br>var i, k: Integer;<br>begin<br>k := 0;<br>for i := 1 to n - 1 do begin<br>if X[i] * Y[k] &lt; X[k] * Y[i] then k := i;<br>end;<br>x := X[k]; y := Y[k];<br>end;</p>\n<h4>Reference informatyczny - wyszukiwanie minimum</h4>\n<blockquote>Reference - Wyszukiwanie minimum w tablicy:<br>- Klasyczny algorytm O(n) z jedną zmienną przechowującą bieżące minimum.<br>- Inicjalizacja: minimum = pierwszy element. Iteracja: porównanie z pozostałymi.<br>- Tutaj funkcja porównująca to <code>X[i]/Y[i]</code>, czyli <strong>funkcja klucza</strong> (analogicznie do <code>key=</code> w Python <code>min()</code>).<br><br>Reference - Porównanie ilorazów bez dzielenia:<br>- <code>a/b &lt; c/d</code> ⟺ <code>a·d &lt; c·b</code> (gdy b, d &gt; 0).<br>- Zaleta: brak błędów zaokrąglenia floating-point.<br>- Wada: ryzyko przepełnienia int (gdy <code>a·d</code> duże). W zadaniu Y &gt; 0 zawsze, więc bezpiecznie.<br><br>Reference - Interpretacja geometryczna:<br>- Iloraz X/Y to <strong>kąt nachylenia</strong> linii od obserwatora (0,0) do punktu (X, Y).<br>- Im mniejszy iloraz (ujemny dla X&lt;0), tym bardziej w lewo.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 2.1, max 2 pkt):<br>- <strong>1 pkt</strong> za prawidłową inicjalizację (k = 1) ORAZ poprawną pętlę (dla i = 2, , n)<br>- <strong>1 pkt</strong> za prawidłowe porównanie (X[i]/Y[i] &lt; X[k]/Y[k]) ORAZ wyznaczenie wyniku (x, y)<br>- <strong>0 pkt</strong> - odpowiedź błędna lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Inicjalizacja k = 0</strong> - w pseudokodzie CKE indeks startowy to 1, nie 0.</li><li><strong>Wyszukiwanie maksimum</strong> zamiast minimum - szczyt skrajnie LEWY to NAJMNIEJSZY iloraz X/Y.</li><li><strong>Porównanie bezpośrednie X[i] &lt; X[k]</strong> - zła interpretacja &quot;lewo&quot; jako najmniejsze X. Trzeba uwzględnić Y.</li><li><strong>Zwracanie indeksu</strong> zamiast współrzędnych - pytanie pyta o (x, y), nie o k.</li><li><strong>Float vs integer division</strong> - w Pascal <code>/</code> zwraca Real, w C++ trzeba uważać przy int. Bezpieczniej mnożyć skrośnie.</li><li><strong>Pominięcie warunku Y &gt; 0</strong> - w zadaniu Y jest dodatnie (z definicji), więc krzyżowe mnożenie bezpieczne.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Jedno przejście przez tablicę: <strong>O(n)</strong> porównań.</li><li>Pamięć: <strong>O(1)</strong> dodatkowa (tylko zmienna k).</li><li><strong>Optymalne</strong> - nie da się znaleźć minimum w mniej niż O(n) (każdy element trzeba sprawdzić).</li></ul>"}]}