{"id":"informatyka-2019-maj-matura-rozszerzona/zad/1.1","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"1.1","points":5,"ptype":"open","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Zadanie 1.1. (0-5)\nNapisz algorytm (w postaci listy kroków, w pseudokodzie lub w wybranym języku\nprogramowania), który dla danego ciągu liczb zapisanych przez dzieci znajdzie pierwszą liczbę\nzapisaną przez Jasia. Zakładamy, że każde z dzieci zapisało co najmniej jedną liczbę.\nPrzy ocenie będzie brana pod uwagę złożoność czasowa Twojego algorytmu. Maksymalną\nliczbę punktów uzyskasz za algorytm o złożoności lepszej niż liniowa.\nUwaga: W zapisie algorytmu możesz wykorzystać tylko operacje arytmetyczne (dodawanie,\nodejmowanie, mnożenie, dzielenie, dzielenie całkowite, reszta z dzielenia), instrukcje\nporównania, instrukcje sterujące i przypisania do zmiennych lub samodzielnie napisane\nfunkcje, wykorzystujące wyżej wymienione operacje.\nSpecyfikacja:\nDane:\nn\n- liczba całkowita większa od 1\nA[1 n]\n- tablica zawierająca ciąg n liczb zapisanych przez dzieci (najpierw\nwszystkie liczby nieparzyste, a potem wszystkie liczby parzyste)\nWynik:\nw\n- pierwsza od lewej parzysta liczba w tablicy A\nPrzykład:\nDane:\nn = 10\nA[1 n] = ሼ5, 99, 3, 7, 111, 13, 4, 24, 4, 8ሽ\nWynik:\nw = 4\nMIN_1R","answer":null,"answer_text":"Zadanie 1.1. (0-5)\nWymagania ogólne\nWymagania szczegółowe\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […]\nz zastosowaniem podejś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), […]\n16) opisuje własności algorytmów na\npodstawie ich analizy;\n17) ocenia zgodność algorytmu ze\nspecyfikacją problemu;\n18) oblicza liczbę operacji wykonywanych\nprzez algorytm;\n20) bada efektywność komputerowych\nrozwiązań problemów.\nSchemat punktowania\n5 p. - za poprawny algorytm o złożoności czasowej lepszej niż liniowa, w tym:\n1 p. - prawidłowy warunek pętli,\n1 p. - prawidłowe wyznaczenie podziału ciągu liczb,\n1 p. - prawidłowe wyznaczenie początku podciągu liczb,\n1 p. - prawidłowe wyznaczenie końca podciągu liczb,\n1 p. - prawidłowe wyznaczenie pierwszego elementu parzystego w A[] (lub jego indeksu).\n3 p. - za poprawny algorytm o złożoności czasowej liniowej, w tym:\n1 p. - za prawidłowy przebieg pętli,\n1 p. - za sprawdzenie warunku (parzystości liczby),\n1 p. - prawidłowe wyznaczenie pierwszego elementu parzystego w A[] (lub jego\nindeksu).\n0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.\nUwaga: Za każde inne poprawne rozwiązanie o złożoności lepszej niż liniowa przyznajemy\nmaksymalnie 5 punktów, a o złożoności liniowej - maksymalnie 3 punkty.\nPrzykładowe rozwiązania\nAlgorytm o złożoności logarytmicznej - wyszukiwanie binarne (w języku c++)\np ←1\nk ← n\ndopóki p <k wykonuj\ns ← (p + k) div 2\njeżeli ( A[s] mod 2 = 1 )\np ← s + 1\nw przeciwnym przypadku\nk ← s\nw ← A[p]\nAlgorytm o złożoności logarytmicznej - wyszukiwanie binarne (w języku Python)\ndef szukaj_bin(A):\nlewy, prawy = 1, n\nwhile lewy < prawy:\nśrodkowy = (lewy + prawy) // 2\nif A[środkowy] % 2 != 0:\nlewy = środkowy + 1\nelse:\nprawy = środkowy\nreturn prawy\nAlgorytm o złożoności liniowej - wyszukiwanie liniowe\np ←1\ndopóki A[p] mod 2 = 1 wykonuj\np ← p + 1\nw ← A[p]\nAlgorytm o złożoności pierwiastkowej\nint pier(int n){\nint i = 1;\nwhile(i * i < n) i++;\nif(i * i > n) i--;\nreturn i;\n}\nint wyszukiwanie(){\nint p = pier(n) - 1;\nint i = p;\nwhile(i < n)\n{\nif(A[i] % 2 == 0){\nint j = i;\nwhile(A[j] % 2 == 0) j--;\nreturn j + 1;\n}\nif(i + p > n) i = n - 1;\ni += p;\n}\n}\nw=A[wyszukiwanie()];","solution":"## Poprawna odpowiedź\n\n**Algorytm wyszukiwania binarnego (zmodyfikowanego) - złożoność O(log n):**\n\np ← 1\nk ← n\ndopóki p < k wykonuj\ns ← (p + k) div 2\njeżeli A[s] mod 2 = 1\np ← s + 1\nw przeciwnym przypadku\nk ← s\nw ← A[p]\n\n## Sposób 1 - wyszukiwanie binarne O(log n) [maksymalna punktacja]\n\n**Kluczowa obserwacja:** ciąg ma strukturę `[nieparzyste, nieparzyste, , parzyste, parzyste, ]`. Szukamy **granicy** między częścią nieparzystą a parzystą - czyli pierwszego indeksu z liczbą parzystą. Tak posortowany ciąg (najpierw 1, potem 0 dla parzystości) idealnie nadaje się do **wyszukiwania binarnego** - szukamy pierwszego wystąpienia 0.\n\n**Idea:** utrzymujemy przedział `[p, k]` zawierający szukaną pierwszą parzystą:\n- środek `s = (p+k) div 2`.\n- jeśli `A[s]` jest nieparzyste (mod 2 = 1) → granica jest po prawej: `p ← s+1`.\n- jeśli `A[s]` jest parzyste → granica może być w `s` lub wcześniej: `k ← s` (NIE `s-1`, bo `s` to kandydat!).\n- pętla kończy się gdy `p = k` → `A[p]` to pierwsza parzysta.\n\n**Python:**\n```python\ndef pierwsza_parzysta(A, n):\np, k = 0, n - 1 # indeksowanie od 0 w Python\nwhile p < k:\ns = (p + k) // 2\nif A[s] % 2 == 1:\np = s + 1\nelse:\nk = s\nreturn A[p]\n\nA = [5, 99, 3, 7, 111, 13, 4, 24, 4, 8]\nprint(pierwsza_parzysta(A, len(A))) # 4\n\n**Pascal (indeksowanie od 1 jak w CKE):**\n```pascal\nfunction PierwszaParzysta(var A: array of LongInt; n: Integer): LongInt;\nvar p, k, s: Integer;\nbegin\np := 1; k := n;\nwhile p < k do\nbegin\ns := (p + k) div 2;\nif A[s] mod 2 = 1 then\np := s + 1\nelse\nk := s;\nend;\nPierwszaParzysta := A[p];\nend;\n\n**C++:**\n```cpp\nint pierwszaParzysta(int A[], int n) {\nint p = 1, k = n;\nwhile (p < k) {\nint s = (p + k) / 2;\nif (A[s] % 2 == 1) p = s + 1;\nelse k = s;\n}\nreturn A[p];\n}\n\n**Weryfikacja na przykładzie:** A = [5,99,3,7,111,13,4,24,4,8], n=10.\n- p=1, k=10 → s=5, A[5]=111 nieparzysta → p=6.\n- p=6, k=10 → s=8, A[8]=24 parzysta → k=8.\n- p=6, k=8 → s=7, A[7]=4 parzysta → k=7.\n- p=6, k=7 → s=6, A[6]=13 nieparzysta → p=7.\n- p=7, k=7 → pętla kończy. w = A[7] = 4 ✓\n\n## Sposób 2 - wyszukiwanie liniowe O(n) [max 3 pkt]\n\nNajprostsza wersja - przeglądamy tablicę od lewej, zwracamy pierwszy element parzysty:\n\ndla i od 1 do n wykonuj\njeżeli A[i] mod 2 = 0\nw ← A[i]\nzakończ\n\n**Python:**\n```python\ndef liniowo(A):\nfor x in A:\nif x % 2 == 0:\nreturn x\n\nDziała poprawnie, ale klucz CKE nagradza maksymalnie 3 pkt zamiast 5 - uczyć się więc rozwiązania binarnego.\n\n## Reference informatyczny - wyszukiwanie binarne\n\n> Reference - Binary Search w wariancie \"znajdź pierwsze wystąpienie\":\n> - Klasyczne wyszukiwanie binarne szuka **dokładnej wartości** - tutaj szukamy **granicy** (pierwszy element spełniający warunek).\n> - Niezmiennik pętli: w przedziale `[p, k]` znajduje się szukana wartość.\n> - WAŻNE: gdy `A[s]` spełnia warunek (parzyste), ustawiamy `k = s` (NIE `s-1`!), bo `s` może być odpowiedzią.\n> - Złożoność: **O(log n)** - w każdej iteracji przedział kurczy się dwukrotnie.\n> - Wymagania: monotoniczność warunku (od pewnego momentu wszystkie elementy spełniają warunek).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 1.1, max 5 pkt):\n> - **5 pkt** - algorytm o złożoności lepszej niż liniowa (binarka):\n> - 1 pkt - prawidłowy warunek pętli (`p < k`)\n> - 1 pkt - prawidłowe wyznaczenie podziału ciągu (s = (p+k) div 2)\n> - 1 pkt - prawidłowe wyznaczenie początku podciągu (p ← s+1)\n> - 1 pkt - prawidłowe wyznaczenie końca podciągu (k ← s)\n> - 1 pkt - prawidłowe wyznaczenie pierwszego parzystego (w ← A[p])\n> - **3 pkt** - algorytm liniowy:\n> - 1 pkt - prawidłowy przebieg pętli\n> - 1 pkt - sprawdzenie warunku parzystości\n> - 1 pkt - wyznaczenie pierwszego parzystego\n> - **0 pkt** - błędna lub brak odpowiedzi\n\n## Typowe pułapki\n\n- **`k ← s-1` zamiast `k ← s`** - gubimy kandydata; pętla może minąć poprawny indeks.\n- **`p ← s` zamiast `p ← s+1`** - pętla nie kończy się gdy A[s] nieparzysta i p == s.\n- **Warunek `p ≤ k`** zamiast `p < k` - niepotrzebna dodatkowa iteracja, ryzyko out-of-bounds.\n- **Off-by-one indeksowanie** - CKE używa od 1, Python/C++ od 0.\n- **Test parzystości** `A[s] mod 2 = 0` vs `A[s] mod 2 = 1` - łatwo pomylić kierunek.\n- **Brak założenia, że co najmniej jedna parzysta liczba istnieje** - algorytm tego nie sprawdza, ale w treści mamy gwarancję (Jaś zapisał co najmniej jedną liczbę).\n\n## Złożoność obliczeniowa\n\n- **Czas: O(log n)** - w każdej iteracji przedział `[p, k]` kurczy się o połowę.\n- **Pamięć: O(1)** - kilka zmiennych pomocniczych (p, k, s).\n- Dla porównania: rozwiązanie liniowe = O(n) (max 3 pkt w CKE).","image":"img/informatyka-2019-maj-matura-rozszerzona/zad-1.1.webp","solution_image":null,"topics":null,"page_from":2,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2019 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 1.1. (0-5)<br>Napisz algorytm (w postaci listy kroków, w pseudokodzie lub w wybranym języku<br>programowania), który dla danego ciągu liczb zapisanych przez dzieci znajdzie pierwszą liczbę<br>zapisaną przez Jasia. Zakładamy, że każde z dzieci zapisało co najmniej jedną liczbę.<br>Przy ocenie będzie brana pod uwagę złożoność czasowa Twojego algorytmu. Maksymalną<br>liczbę punktów uzyskasz za algorytm o złożoności lepszej niż liniowa.<br>Uwaga: W zapisie algorytmu możesz wykorzystać tylko operacje arytmetyczne (dodawanie,<br>odejmowanie, mnożenie, dzielenie, dzielenie całkowite, reszta z dzielenia), instrukcje<br>porównania, instrukcje sterujące i przypisania do zmiennych lub samodzielnie napisane<br>funkcje, wykorzystujące wyżej wymienione operacje.<br>Specyfikacja:<br>Dane:<br>n</p>\n<ul><li>liczba całkowita większa od 1</li></ul>\n<p>A[1 n]</p>\n<ul><li>tablica zawierająca ciąg n liczb zapisanych przez dzieci (najpierw</li></ul>\n<p>wszystkie liczby nieparzyste, a potem wszystkie liczby parzyste)<br>Wynik:<br>w</p>\n<ul><li>pierwsza od lewej parzysta liczba w tablicy A</li></ul>\n<p>Przykład:<br>Dane:<br>n = 10<br>A[1 n] = ሼ5, 99, 3, 7, 111, 13, 4, 24, 4, 8ሽ<br>Wynik:<br>w = 4<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 1.1. (0-5)<br>Wymagania ogólne<br>Wymagania szczegółowe<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji […]<br>z zastosowaniem 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), […]</p>\n<ol><li>opisuje własności algorytmów na</li></ol>\n<p>podstawie ich analizy;</p>\n<ol><li>ocenia zgodność algorytmu ze</li></ol>\n<p>specyfikacją problemu;</p>\n<ol><li>oblicza liczbę operacji wykonywanych</li></ol>\n<p>przez algorytm;</p>\n<ol><li>bada efektywność komputerowych</li></ol>\n<p>rozwiązań problemów.<br>Schemat punktowania<br>5 p. - za poprawny algorytm o złożoności czasowej lepszej niż liniowa, w tym:<br>1 p. - prawidłowy warunek pętli,<br>1 p. - prawidłowe wyznaczenie podziału ciągu liczb,<br>1 p. - prawidłowe wyznaczenie początku podciągu liczb,<br>1 p. - prawidłowe wyznaczenie końca podciągu liczb,<br>1 p. - prawidłowe wyznaczenie pierwszego elementu parzystego w A[] (lub jego indeksu).<br>3 p. - za poprawny algorytm o złożoności czasowej liniowej, w tym:<br>1 p. - za prawidłowy przebieg pętli,<br>1 p. - za sprawdzenie warunku (parzystości liczby),<br>1 p. - prawidłowe wyznaczenie pierwszego elementu parzystego w A[] (lub jego<br>indeksu).<br>0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.<br>Uwaga: Za każde inne poprawne rozwiązanie o złożoności lepszej niż liniowa przyznajemy<br>maksymalnie 5 punktów, a o złożoności liniowej - maksymalnie 3 punkty.<br>Przykładowe rozwiązania<br>Algorytm o złożoności logarytmicznej - wyszukiwanie binarne (w języku c++)<br>p ←1<br>k ← n<br>dopóki p &lt;k wykonuj<br>s ← (p + k) div 2<br>jeżeli ( A[s] mod 2 = 1 )<br>p ← s + 1<br>w przeciwnym przypadku<br>k ← s<br>w ← A[p]<br>Algorytm o złożoności logarytmicznej - wyszukiwanie binarne (w języku Python)<br>def szukaj_bin(A):<br>lewy, prawy = 1, n<br>while lewy &lt; prawy:<br>środkowy = (lewy + prawy) // 2<br>if A[środkowy] % 2 != 0:<br>lewy = środkowy + 1<br>else:<br>prawy = środkowy<br>return prawy<br>Algorytm o złożoności liniowej - wyszukiwanie liniowe<br>p ←1<br>dopóki A[p] mod 2 = 1 wykonuj<br>p ← p + 1<br>w ← A[p]<br>Algorytm o złożoności pierwiastkowej<br>int pier(int n){<br>int i = 1;<br>while(i * i &lt; n) i++;<br>if(i * i &gt; n) i--;<br>return i;<br>}<br>int wyszukiwanie(){<br>int p = pier(n) - 1;<br>int i = p;<br>while(i &lt; n)<br>{<br>if(A[i] % 2 == 0){<br>int j = i;<br>while(A[j] % 2 == 0) j--;<br>return j + 1;<br>}<br>if(i + p &gt; n) i = n - 1;<br>i += p;<br>}<br>}<br>w=A[wyszukiwanie()];</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Algorytm wyszukiwania binarnego (zmodyfikowanego) - złożoność O(log n):</strong></p>\n<p>p ← 1<br>k ← n<br>dopóki p &lt; k wykonuj<br>s ← (p + k) div 2<br>jeżeli A[s] mod 2 = 1<br>p ← s + 1<br>w przeciwnym przypadku<br>k ← s<br>w ← A[p]</p>\n<h4>Sposób 1 - wyszukiwanie binarne O(log n) [maksymalna punktacja]</h4>\n<p><strong>Kluczowa obserwacja:</strong> ciąg ma strukturę <code>[nieparzyste, nieparzyste, , parzyste, parzyste, ]</code>. Szukamy <strong>granicy</strong> między częścią nieparzystą a parzystą - czyli pierwszego indeksu z liczbą parzystą. Tak posortowany ciąg (najpierw 1, potem 0 dla parzystości) idealnie nadaje się do <strong>wyszukiwania binarnego</strong> - szukamy pierwszego wystąpienia 0.</p>\n<p><strong>Idea:</strong> utrzymujemy przedział <code>[p, k]</code> zawierający szukaną pierwszą parzystą:</p>\n<ul><li>środek <code>s = (p+k) div 2</code>.</li><li>jeśli <code>A[s]</code> jest nieparzyste (mod 2 = 1) → granica jest po prawej: <code>p ← s+1</code>.</li><li>jeśli <code>A[s]</code> jest parzyste → granica może być w <code>s</code> lub wcześniej: <code>k ← s</code> (NIE <code>s-1</code>, bo <code>s</code> to kandydat!).</li><li>pętla kończy się gdy <code>p = k</code> → <code>A[p]</code> to pierwsza parzysta.</li></ul>\n<p><strong>Python:</strong><br>```python<br>def pierwsza_parzysta(A, n):<br>p, k = 0, n - 1 # indeksowanie od 0 w Python<br>while p &lt; k:<br>s = (p + k) // 2<br>if A[s] % 2 == 1:<br>p = s + 1<br>else:<br>k = s<br>return A[p]</p>\n<p>A = [5, 99, 3, 7, 111, 13, 4, 24, 4, 8]<br>print(pierwsza_parzysta(A, len(A))) # 4</p>\n<p><strong>Pascal (indeksowanie od 1 jak w CKE):</strong><br>```pascal<br>function PierwszaParzysta(var A: array of LongInt; n: Integer): LongInt;<br>var p, k, s: Integer;<br>begin<br>p := 1; k := n;<br>while p &lt; k do<br>begin<br>s := (p + k) div 2;<br>if A[s] mod 2 = 1 then<br>p := s + 1<br>else<br>k := s;<br>end;<br>PierwszaParzysta := A[p];<br>end;</p>\n<p><strong>C++:</strong><br>```cpp<br>int pierwszaParzysta(int A[], int n) {<br>int p = 1, k = n;<br>while (p &lt; k) {<br>int s = (p + k) / 2;<br>if (A[s] % 2 == 1) p = s + 1;<br>else k = s;<br>}<br>return A[p];<br>}</p>\n<p><strong>Weryfikacja na przykładzie:</strong> A = [5,99,3,7,111,13,4,24,4,8], n=10.</p>\n<ul><li>p=1, k=10 → s=5, A[5]=111 nieparzysta → p=6.</li><li>p=6, k=10 → s=8, A[8]=24 parzysta → k=8.</li><li>p=6, k=8 → s=7, A[7]=4 parzysta → k=7.</li><li>p=6, k=7 → s=6, A[6]=13 nieparzysta → p=7.</li><li>p=7, k=7 → pętla kończy. w = A[7] = 4 ✓</li></ul>\n<h4>Sposób 2 - wyszukiwanie liniowe O(n) [max 3 pkt]</h4>\n<p>Najprostsza wersja - przeglądamy tablicę od lewej, zwracamy pierwszy element parzysty:</p>\n<p>dla i od 1 do n wykonuj<br>jeżeli A[i] mod 2 = 0<br>w ← A[i]<br>zakończ</p>\n<p><strong>Python:</strong><br>```python<br>def liniowo(A):<br>for x in A:<br>if x % 2 == 0:<br>return x</p>\n<p>Działa poprawnie, ale klucz CKE nagradza maksymalnie 3 pkt zamiast 5 - uczyć się więc rozwiązania binarnego.</p>\n<h4>Reference informatyczny - wyszukiwanie binarne</h4>\n<blockquote>Reference - Binary Search w wariancie &quot;znajdź pierwsze wystąpienie&quot;:<br>- Klasyczne wyszukiwanie binarne szuka <strong>dokładnej wartości</strong> - tutaj szukamy <strong>granicy</strong> (pierwszy element spełniający warunek).<br>- Niezmiennik pętli: w przedziale <code>[p, k]</code> znajduje się szukana wartość.<br>- WAŻNE: gdy <code>A[s]</code> spełnia warunek (parzyste), ustawiamy <code>k = s</code> (NIE <code>s-1</code>!), bo <code>s</code> może być odpowiedzią.<br>- Złożoność: <strong>O(log n)</strong> - w każdej iteracji przedział kurczy się dwukrotnie.<br>- Wymagania: monotoniczność warunku (od pewnego momentu wszystkie elementy spełniają warunek).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 1.1, max 5 pkt):<br>- <strong>5 pkt</strong> - algorytm o złożoności lepszej niż liniowa (binarka):<br>- 1 pkt - prawidłowy warunek pętli (<code>p &lt; k</code>)<br>- 1 pkt - prawidłowe wyznaczenie podziału ciągu (s = (p+k) div 2)<br>- 1 pkt - prawidłowe wyznaczenie początku podciągu (p ← s+1)<br>- 1 pkt - prawidłowe wyznaczenie końca podciągu (k ← s)<br>- 1 pkt - prawidłowe wyznaczenie pierwszego parzystego (w ← A[p])<br>- <strong>3 pkt</strong> - algorytm liniowy:<br>- 1 pkt - prawidłowy przebieg pętli<br>- 1 pkt - sprawdzenie warunku parzystości<br>- 1 pkt - wyznaczenie pierwszego parzystego<br>- <strong>0 pkt</strong> - błędna lub brak odpowiedzi</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong><code>k ← s-1</code> zamiast <code>k ← s</code></strong> - gubimy kandydata; pętla może minąć poprawny indeks.</li><li><strong><code>p ← s</code> zamiast <code>p ← s+1</code></strong> - pętla nie kończy się gdy A[s] nieparzysta i p == s.</li><li><strong>Warunek <code>p ≤ k</code></strong> zamiast <code>p &lt; k</code> - niepotrzebna dodatkowa iteracja, ryzyko out-of-bounds.</li><li><strong>Off-by-one indeksowanie</strong> - CKE używa od 1, Python/C++ od 0.</li><li><strong>Test parzystości</strong> <code>A[s] mod 2 = 0</code> vs <code>A[s] mod 2 = 1</code> - łatwo pomylić kierunek.</li><li><strong>Brak założenia, że co najmniej jedna parzysta liczba istnieje</strong> - algorytm tego nie sprawdza, ale w treści mamy gwarancję (Jaś zapisał co najmniej jedną liczbę).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li><strong>Czas: O(log n)</strong> - w każdej iteracji przedział <code>[p, k]</code> kurczy się o połowę.</li><li><strong>Pamięć: O(1)</strong> - kilka zmiennych pomocniczych (p, k, s).</li><li>Dla porównania: rozwiązanie liniowe = O(n) (max 3 pkt w CKE).</li></ul>"}]}