{"paper":{"id":"informatyka-2017-maj-matura-rozszerzona","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","variant":null,"exam_pdf":"informatyka-2017-maj-matura-rozszerzona/informatyka-2017-maj-matura-rozszerzona.pdf","key_pdf":"informatyka-2017-maj-matura-rozszerzona-odpowiedzi/informatyka-2017-maj-matura-rozszerzona-odpowiedzi.pdf","question_count":24,"source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},"questions":[{"id":"informatyka-2017-maj-matura-rozszerzona/zad/1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"1","points":null,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 1. Prostokąt\nDane są:\nliczba całkowita n większa od 1\nzbiór A zawierający n dodatnich, różnych liczb całkowitych\nliczba pierwsza p","answer":null,"answer_text":null,"solution":null,"image":"img/informatyka-2017-maj-matura-rozszerzona/zad-1.webp","solution_image":null,"topics":null,"page_from":2,"source":"ocr","answer_source":null,"answer_text_source":null,"solution_source":null,"text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/1.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"1.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 1.1. (0-2)\nDla danych z każdego wiersza w tabeli oblicz największe pole powierzchni prostokąta, które\nnie jest podzielne przez p, a długości sąsiednich boków tego prostokąta są różne (nie może on\nbyć kwadratem) i należą do zbioru A. Zapisz pole tego prostokąta w kolumnie S.\nJeżeli taki prostokąt nie istnieje, jako wynik podaj liczbę 0 (zero).\nZbiór A\np\nS - pole szukanego prostokąta lub\n0 (zero), jeśli nie można\nzbudować takiego prostokąta\n7, 5, 11, 33\n3\n77\n15, 12, 10, 6, 5, 1\n5\n6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18\n7\n4, 34, 16, 8, 6, 22, 14, 12, 2, 7\n2","answer":null,"answer_text":"Zadanie 1.1. (0-2)\nWymagania ogólne\nWymagania szczegółowe\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […],\nz zastosowaniem podejścia\nalgorytmicznego.\n5. Rozwiązywanie problemów\ni podejmowanie decyzji […], stosowanie\npodejścia algorytmicznego.\nZdający:\n2) stosuje podejście algorytmiczne do\nrozwiązywania problemu.\nSchemat punktowania\n2 p. - za prawidłową odpowiedź w trzech wierszach.\n1 p. - w przypadku tyko dwóch prawidłowych odpowiedzi.\n0 p. - za jedną poprawną odpowiedź albo za brak odpowiedzi.\nPoprawna odpowiedź:\nZbiór A\np\nS - pole szukanego prostokąta\n15, 12, 10, 6, 5, 1\n5\n72 (12*6)\n6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18\n7\n216 (18*12)\n4, 34, 16, 8, 6, 22, 14, 12, 2, 7\n2\n0","solution":"## Poprawna odpowiedź\n\n| Zbiór A | p | S |\n| 7, 5, 11, 33 | 3 | 77 |\n| 15, 12, 10, 6, 5, 1 | 5 | **72** (12·6) |\n| 6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18 | 7 | **216** (18·12) |\n| 4, 34, 16, 8, 6, 22, 14, 12, 2, 7 | 2 | **0** |\n\n## Sposób 1 - kluczowa obserwacja matematyczna\n\nIloczyn a·b nie jest podzielny przez liczbę pierwszą p **wtedy i tylko wtedy, gdy ani a, ani b nie jest podzielne przez p** (własność liczb pierwszych: jeśli p|a·b to p|a lub p|b).\n\n**Strategia:** Odfiltruj ze zbioru A wszystkie liczby podzielne przez p. Z pozostałych weź **dwie największe różne** liczby - ich iloczyn da maksimum.\n\n## Sposób 2 - analiza każdego wiersza\n\n### Wiersz 1: A = {7, 5, 11, 33}, p = 3\nLiczby niepodzielne przez 3: 7, 5, 11 (33 = 3·11 - odpada).\nNajwiększe dwie różne: 11 i 7 → **S = 11 · 7 = 77** ✓ (zgadza się z przykładem w arkuszu)\n\n### Wiersz 2: A = {15, 12, 10, 6, 5, 1}, p = 5\nLiczby niepodzielne przez 5: 12, 6, 1 (15, 10, 5 podzielne - odpadają).\nNajwiększe dwie różne: 12 i 6 → **S = 12 · 6 = 72**\n\n### Wiersz 3: A = {6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18}, p = 7\nLiczby niepodzielne przez 7: 6, 12, 10, 5, 9, 4, 8, 18 (28, 7, 14 odpadają jako wielokrotności 7).\nNajwiększe dwie różne: 18 i 12 → **S = 18 · 12 = 216**\n\n### Wiersz 4: A = {4, 34, 16, 8, 6, 22, 14, 12, 2, 7}, p = 2\nLiczby niepodzielne przez 2 (czyli nieparzyste): tylko **7**.\nMamy tylko 1 liczbę nieparzystą - nie można zbudować prostokąta o dwóch RÓŻNYCH bokach.\n**S = 0**\n\n## Sposób 3 - weryfikacja kodem (Python)\n\n```python\ndef pole_max(A, p):\nfiltr = [x for x in A if x % p != 0]\nif len(filtr) < 2:\nreturn 0\nfiltr.sort(reverse=True)\nreturn filtr[0] * filtr[1]\n\nprint(pole_max([7, 5, 11, 33], 3)) # 77\nprint(pole_max([15, 12, 10, 6, 5, 1], 5)) # 72\nprint(pole_max([6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18], 7)) # 216\nprint(pole_max([4, 34, 16, 8, 6, 22, 14, 12, 2, 7], 2)) # 0\n\n## Reference informatyczny - własności liczb pierwszych\n\n> Reference - liczby pierwsze:\n> - Liczba pierwsza p dzieli iloczyn a·b ⟺ p|a lub p|b (kluczowa własność, podstawa rozkładu na czynniki).\n> - Sprawdzenie podzielności: `a mod p == 0` w pseudokodzie / `a % p == 0` w Python/C++.\n> - Dla maksymalizacji iloczynu dwóch różnych elementów z listy bierzemy dwie największe (sortowanie malejące → wybierz [0] i [1]).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 1.1, max 2 pkt):\n> - **2 pkt** - za prawidłową odpowiedź w trzech wierszach (72, 216, 0)\n> - **1 pkt** - za prawidłową odpowiedź w dwóch wierszach\n> - **0 pkt** - za jedną poprawną odpowiedź albo brak\n\n## Typowe pułapki\n\n- **Zapomnienie warunku „boki różne\"**: w wierszu 1 nie można wziąć 33·33, choć 33² byłoby większe - boki muszą być różne. Ale 33 i tak odpada (podzielne przez 3).\n- **Wiersz 4 jest pułapką**: tylko jedna liczba nieparzysta (7), więc S = 0. Łatwo przeoczyć - np. ktoś bierze 7·jakaś_parzysta, ale wtedy iloczyn jest parzysty (czyli podzielny przez 2).\n- **Pomylenie p z dowolną liczbą** - p musi być liczbą pierwszą, dlatego stosujemy własność (jeśli p|a·b to p|a lub p|b). Dla liczb złożonych to nie działa (np. 6|2·3, ale 6∤2 i 6∤3).\n\n## Złożoność obliczeniowa\n\nPrzefiltrowanie + znalezienie 2 największych: **O(n)** dla każdego wiersza tabeli.","image":"img/informatyka-2017-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 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/1.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"1.2","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 1.2. (0-4)\nZapisz (w postaci pseudokodu, listy kroków lub w wybranym języku programowania) algorytm\nobliczający największe pole powierzchni prostokąta, które nie jest podzielne przez p, a długości\nsąsiednich boków tego prostokąta należą do zbioru A i są różne.\nPrzy ocenie brana będzie pod uwagę złożoność obliczeniowa Twojego algorytmu.\nUwaga:\nW zapisie algorytmu możesz wykorzystywać tylko następujące operacje arytmetyczne:\ndodawanie, odejmowanie, mnożenie, dzielenie całkowite i obliczanie reszty z dzielenia.\nSpecyfikacja:\nDane:\nn\n- liczba całkowita większa od 1\nA[1 n] - tablica zawierająca n różnych, dodatnich liczb całkowitych\np\n- liczba pierwsza\nWynik:\nS\n- największe pole powierzchni prostokąta, które nie jest podzielne przez p,\na długości sąsiednich boków tego prostokąta są różne i zawarte w tablicy A;\njeśli nie można zbudować takiego prostokąta, wynikiem powinno być 0 (zero)\nMIN_1R\nAlgorytm\nWypełnia\negzaminator\nNr zadania\n1.1.\n1.2.\nMaks. liczba pkt.\n2\n4\nUzyskana liczba pkt.\nMIN_1R","answer":null,"answer_text":"Zadanie 1.2. (0-4)\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:\n2) stosuje podejście algorytmiczne do\nrozwiązywania problemu;\n4) dobiera efektywny algorytm do\nrozwiązania sytuacji problemowej i zapisuje\ngo w wy branej notacji;\n11) opisuje podstawowe algorytmy i stosuje:\na) algorytmy na liczbach całkowitych;\nSchemat punktowania\n4 p. - za prawidłowe rozwiązanie o złożoności liniowej, w tym:\n3 p. - za poprawne wyznaczenie długości dwóch najdłuższych boków, w tym\n2 p. - za wyznaczenie długości dwóch najdłuższych boków.\nUwaga: za wyznaczanie długości dwóch najdłuższych boków, w tym tylko jednej poprawnej -\n1 punkt\n1 p. - za sprawdzanie podzielności przez p.\n1 p. - za wyznaczenie największego pola prostokąta o bokach różnej długości i uwzględnienie\nwyniku S = 0 - 1 punkt\n2 p. - za prawidłowe rozwiązanie o złożoności innej niż liniowa, w tym\n1 p. - sprawdzanie podzielności przez p.\n1 p. - za wyznaczenie największego pola prostokąta o bokach różnej długości oraz\nuwzględnienie wyniku S = 0.\n0 p. - za podanie błędnej odpowiedzi albo za brak odpowiedzi.\nPrzykładowe rozwiązania:\n1.Algorytm o złożoności liniowej\nint max1,max2;\nmax1 = max2 = 0;\nfor(int i = 1; i <= n; ++i)\n{\nif(A[i] % p != 0)\n{\nif(A[i] > max1)\n{\nmax2 = max1;\nmax1 = A[i];\n}\nelse if(A[i] > max2)\nmax2 = A[i];\n}\n}\ncout << max1 * max2;\n2. Algorytm o złożoności kwadratowej\nint maxpole = 0;\nfor(int i = 1; i < n; ++i)\n{\nfor(int j = i + 1; j <=n; ++j)\n{\nint pole = A[i] * A[j];\nif(pole % p != 0)\n{\nif(pole > maxpole)\nmaxpole = pole;\n}\n}\n}\ncout << maxpole;","solution":"## Poprawna odpowiedź\n\nAlgorytm liniowy O(n) - jednokrotne przejście tablicy z aktualizacją dwóch największych elementów niepodzielnych przez p:\n\nmax1 ← 0\nmax2 ← 0\ndla i = 1, 2, , n wykonuj:\njeżeli A[i] mod p ≠ 0:\njeżeli A[i] > max1:\nmax2 ← max1\nmax1 ← A[i]\nw przeciwnym razie jeżeli A[i] > max2:\nmax2 ← A[i]\nS ← max1 * max2\n\n**Wynik:** jeśli max2 = 0 (mniej niż 2 liczby spełniają warunek) → S = 0. W przeciwnym razie S = max1 · max2.\n\n## Sposób 1 - idea algorytmu liniowego\n\nKluczowa własność (z zad. 1.1): liczba pierwsza p dzieli a·b ⟺ p|a lub p|b. Więc szukamy DWÓCH NAJWIĘKSZYCH RÓŻNYCH elementów A, które **nie są podzielne przez p**.\n\nW jednym przejściu pętli utrzymujemy dwa zmienne:\n- `max1` - największa dotąd zaobserwowana liczba niepodzielna przez p,\n- `max2` - druga co do wielkości.\n\nPrzy nowym elemencie A[i] (jeśli niepodzielny przez p):\n- jeśli A[i] > max1 → max2 staje się starym max1, a max1 := A[i],\n- inaczej jeśli A[i] > max2 → max2 := A[i].\n\nGdy max2 = 0, to znaczy że istnieje co najwyżej jedna liczba niepodzielna przez p → S = 0 (max1 * 0 = 0).\n\n## Sposób 2 - implementacja w 3 językach\n\n**Python:**\n```python\ndef max_pole(A, p):\nmax1, max2 = 0, 0\nfor x in A:\nif x % p != 0:\nif x > max1:\nmax2 = max1\nmax1 = x\nelif x > max2:\nmax2 = x\nreturn max1 * max2\n\nprint(max_pole([7, 5, 11, 33], 3)) # 77\nprint(max_pole([4, 34, 16, 8, 6, 22, 14, 12, 2, 7], 2)) # 0\n\n**Pascal:**\n```pascal\nfunction MaxPole(A: array of LongInt; n, p: LongInt): LongInt;\nvar i, max1, max2: LongInt;\nbegin\nmax1 := 0; max2 := 0;\nfor i := 0 to n - 1 do\nif A[i] mod p <> 0 then\nbegin\nif A[i] > max1 then\nbegin\nmax2 := max1;\nmax1 := A[i];\nend\nelse if A[i] > max2 then\nmax2 := A[i];\nend;\nMaxPole := max1 * max2;\nend;\n\n**C++:**\n```cpp\nlong long maxPole(int A[], int n, int p) {\nlong long max1 = 0, max2 = 0;\nfor (int i = 0; i < n; i++) {\nif (A[i] % p != 0) {\nif (A[i] > max1) {\nmax2 = max1;\nmax1 = A[i];\n} else if (A[i] > max2) {\nmax2 = A[i];\n}\n}\n}\nreturn max1 * max2;\n}\n\n## Reference algorytmiczny - wyszukiwanie dwóch największych\n\n> Reference - Dwa największe elementy w tablicy:\n> - Algorytm liniowy O(n): jedna pętla, dwie zmienne max1, max2.\n> - Aktualizacja: gdy x > max1, przesuń max1→max2, max1=x; w innym razie gdy x > max2, max2=x.\n> - Alternatywa: posortuj (O(n log n)) i weź dwa pierwsze - dłużej.\n> - W naszym zadaniu dodatkowy filtr `A[i] mod p ≠ 0`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 1.2, max 4 pkt):\n> - **4 pkt** - algorytm o złożoności liniowej w pełni poprawny, w tym:\n> - 2 pkt - wyznaczenie długości dwóch najdłuższych boków (1 pkt - tylko jednej)\n> - 1 pkt - sprawdzanie podzielności przez p (mod p ≠ 0)\n> - 1 pkt - uwzględnienie różnych długości boków i przypadku S = 0\n> - **2 pkt** - rozwiązanie o złożoności gorszej niż liniowa (np. O(n²) - dwie pętle, lub O(n log n) - sortowanie + wybór)\n> - **0 pkt** - błędne lub brak\n\n## Typowe pułapki\n\n- **Pominięcie warunku „boki różne\"** - gdy A zawiera duplikaty (treść zadania mówi „różne\", więc OK, ale przy implementacji uważać).\n- **Pominięcie S = 0 dla niewystarczającej liczby kandydatów** - gdy mniej niż 2 elementy są niepodzielne przez p, max2 pozostaje 0, S = max1·0 = 0 (algorytm sam obsługuje to dzięki inicjalizacji).\n- **Nieefektywne rozwiązanie** - sortowanie całej tablicy (O(n log n)) lub porównywanie par (O(n²)) traci punkty za niefektywność. Liniowy algorytm jest WYMAGANY na max ocenę.\n- **Wykorzystanie zabronionych operacji** - treść pozwala tylko +, -, *, div, mod. Bez sortowania bibliotecznego (sort()).\n\n## Złożoność obliczeniowa\n\n- **Czas: O(n)** - jedna pętla po n elementach tablicy.\n- **Pamięć: O(1)** - tylko stałe zmienne (max1, max2, i).\n- **Porównanie:** sortowanie + wybór dwóch pierwszych: O(n log n); brute force par: O(n²). Liniowy jest optymalny.","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-1.2.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 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"2","points":null,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 2. Rekurencja\nFunkcja licz(x) przyjmuje jako argument dodatnią liczbę całkowitą x, natomiast jako wynik\ndaje pewną liczbę całkowitą.\nlicz(x)\njeżeli x = 1\npodaj wynik 1\nw przeciwnym przypadku\nw ← licz(x div 2)\njeżeli x mod 2 = 1\npodaj wynik w+1\nw przeciwnym przypadku\npodaj wynik w-1\nUwaga: div - dzielenie całkowite, mod - reszta z dzielenia całkowitego.","answer":null,"answer_text":"0","solution":null,"image":"img/informatyka-2017-maj-matura-rozszerzona/zad-2.webp","solution_image":null,"topics":null,"page_from":4,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":null,"text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/2.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"2.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 2.1. (0-2)\nUzupełnij tabelę - podaj wartość licz(x) dla podanych argumentów x.\nx\nlicz(x)\n11\n2\n13\n21\n32\nMiejsce na obliczenia\nMIN_1R","answer":null,"answer_text":"Zadanie 2.1. (0-2)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […],\nz zastosowaniem podejścia algorytmicznego.\n5) posługuje się podstawowymi technikami\nalgorytmicznymi;\n9) stosuje rekurencję w prostych sytuacjach\nproblemowych\n16) opisuje własności algorytmów na\npodstawie ich analizy;\n17) ocenia zgodność algorytmu ze\nspecyfikacją problemu;\nSchemat punktowania\n2 p. - za podanie trzech poprawnych wartości.\n1 p. - za podanie dwóch poprawnych wartości.\n0 p. - za podanie jednej poprawnej wartości albo za brak odpowiedzi.\nPoprawna odpowiedź:\nx\nlicz(x)\n13\n2\n21\n1\n32\n-4","solution":"## Poprawna odpowiedź\n\n| x | licz(x) |\n| 11 | 2 |\n| 13 | **2** |\n| 21 | **1** |\n| 32 | **-4** |\n\n## Sposób 1 - kluczowa obserwacja\n\nFunkcja `licz(x)` to **suma cyfr binarnych z modyfikowaną wagą**: każda jedynka w zapisie binarnym x daje +1, każde zero daje -1, a najstarszy bit (zawsze 1) startuje od wartości 1. Krótko: **licz(x) = (liczba jedynek w bin(x)) - (liczba zer w bin(x), pomijając wiodące zera) + ** Lepiej: rozwińmy rekurencję.\n\nDla x = 1: zwraca 1.\nDla x > 1: w := licz(x div 2); jeśli x mod 2 = 1 (czyli ostatni bit jest 1) → zwróć w+1; w przeciwnym razie (ostatni bit 0) → zwróć w-1.\n\nWięc każda cyfra binarna x (czytana od najmłodszej, ale pomijając najstarszą - ta startuje wartością 1):\n- bit 1 → dodaje +1\n- bit 0 → odejmuje 1\n\n**Wzór:** licz(x) = 1 + (liczba_jedynek_w_bin(x) - 1) - (liczba_zer_w_bin(x)) = liczba_jedynek - liczba_zer.\n\nUwaga: najstarszy bit (zawsze 1 dla x > 0) liczy się raz, ale w sumie wszystkie jedynki dają +1 każda, zera dają -1 każda. Plus startowa wartość 1 z licz(1) Sprawdźmy.\n\n## Sposób 2 - symulacja krok po kroku\n\n### x = 11 (kontrola)\n11 w binarnym: **1011**\n- licz(11): 11 mod 2 = 1 → w = licz(5), wynik = w + 1\n- licz(5): 5 mod 2 = 1 → w = licz(2), wynik = w + 1\n- licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1\n- licz(1) = 1\n- licz(2) = 1 - 1 = 0\n- licz(5) = 0 + 1 = 1\n- licz(11) = 1 + 1 = **2** ✓\n\n### x = 13\n13 w binarnym: **1101**\n- licz(13): 13 mod 2 = 1 → w = licz(6), wynik = w + 1\n- licz(6): 6 mod 2 = 0 → w = licz(3), wynik = w - 1\n- licz(3): 3 mod 2 = 1 → w = licz(1), wynik = w + 1\n- licz(1) = 1\n- licz(3) = 1 + 1 = 2\n- licz(6) = 2 - 1 = 1\n- licz(13) = 1 + 1 = **2** ✓\n\n### x = 21\n21 w binarnym: **10101**\n- licz(21): 21 mod 2 = 1 → w = licz(10), wynik = w + 1\n- licz(10): 10 mod 2 = 0 → w = licz(5), wynik = w - 1\n- licz(5): 5 mod 2 = 1 → w = licz(2), wynik = w + 1\n- licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1\n- licz(1) = 1\n- licz(2) = 1 - 1 = 0\n- licz(5) = 0 + 1 = 1\n- licz(10) = 1 - 1 = 0\n- licz(21) = 0 + 1 = **1** ✓\n\n### x = 32\n32 w binarnym: **100000**\n- licz(32): 32 mod 2 = 0 → w = licz(16), wynik = w - 1\n- licz(16): 16 mod 2 = 0 → w = licz(8), wynik = w - 1\n- licz(8): 8 mod 2 = 0 → w = licz(4), wynik = w - 1\n- licz(4): 4 mod 2 = 0 → w = licz(2), wynik = w - 1\n- licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1\n- licz(1) = 1\n- licz(2) = 1 - 1 = 0\n- licz(4) = 0 - 1 = -1\n- licz(8) = -1 - 1 = -2\n- licz(16) = -2 - 1 = -3\n- licz(32) = -3 - 1 = **-4** ✓\n\n## Sposób 3 - wzór ogólny\n\nDla x w zapisie binarnym mającym `j` jedynek i `z` zer:\n**licz(x) = j - z**\n\nWeryfikacja:\n- 11 = 1011: j=3, z=1 → 3-1 = 2 ✓\n- 13 = 1101: j=3, z=1 → 3-1 = 2 ✓\n- 21 = 10101: j=3, z=2 → 3-2 = 1 ✓\n- 32 = 100000: j=1, z=5 → 1-5 = **-4** ✓\n\n**Implementacja Python (weryfikacja):**\n```python\ndef licz(x):\nif x == 1:\nreturn 1\nw = licz(x // 2)\nif x % 2 == 1:\nreturn w + 1\nelse:\nreturn w - 1\n\nfor x in [11, 13, 21, 32]:\nprint(x, licz(x)) # 11 2, 13 2, 21 1, 32 -4\n\n## Reference algorytmiczny - rekurencja binarna\n\n> Reference - rekurencja po cyfrach binarnych:\n> - Wzorzec: `f(x) = f(x div 2) ± coś` rozwija cyfry binarne x.\n> - Głębokość rekurencji = liczba bitów x = ⌊log₂ x⌋ + 1.\n> - Funkcja licz: zlicza różnicę między liczbą jedynek a zer w bin(x).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.1, max 2 pkt):\n> - **2 pkt** - za 3 poprawne wartości (z 3 wymaganych: 13, 21, 32)\n> - **1 pkt** - za 2 poprawne\n> - **0 pkt** - za 1 poprawną albo brak\n\n## Typowe pułapki\n\n- **Znak -4 dla x = 32** - łatwo zapomnieć, że funkcja może zwracać liczby ujemne (samo licz(2) = 0, licz(4) = -1).\n- **Pomylenie x mod 2 z x div 2** - pierwsze daje ostatni bit (0/1), drugie usuwa ostatni bit.\n- **Niewłaściwy warunek bazowy** - `if x = 1` (nie x = 0!) zwraca 1.\n\n## Złożoność obliczeniowa\n\n- **Czas: O(log x)** - głębokość rekurencji to liczba bitów x.\n- **Pamięć: O(log x)** - stos rekurencji.","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-2.1.webp","solution_image":null,"topics":null,"page_from":4,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/2.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"2.2","points":2,"ptype":"closed","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 2.2. (0-2)\nDana jest dodatnia liczba całkowita k. Jaka jest najmniejsza dodatnia liczba całkowita x, dla\nktórej obliczanie wartości licz(x) wymaga dokładnie k wywołań funkcji licz, licząc także\npierwsze wywołanie licz(x)? Podkreśl prawidłową odpowiedź.\nPrzykład: obliczenie licz(13) wymaga dokładnie 4 wywołań funkcji licz.\nA) x = k2\nB) x = 2k-1\nC) x = k+1\nD) x = 2k","answer":"B","answer_text":"Zadanie 2.2. (0-2)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […],\nz zastosowaniem podejścia algorytmicznego.\n5) posługuje się podstawowymi technikami\nalgorytmicznymi;\n9) stosuje rekurencję w prostych sytuacjach\nproblemowych\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;\nSchemat punktowania\n2 p. - za prawidłową odpowiedź 2k-1 .\n1 p. - za odpowiedź: 2k.\n0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.\nPoprawna odpowiedź:\n2k-1","solution":"## Poprawna odpowiedź\n\n**B: x = 2^(k-1)**\n\n## Sposób 1 - analiza głębokości rekurencji\n\nFunkcja `licz(x)` wywołuje się rekurencyjnie aż osiągnie x = 1. Każde wywołanie dzieli x przez 2 (`x div 2`). Liczba wywołań to długość ciągu:\n\nx → x div 2 → (x div 2) div 2 → → 1\n\nTo dokładnie **liczba bitów x w zapisie binarnym** = ⌊log₂ x⌋ + 1.\n\nDla dokładnie k wywołań chcemy: ⌊log₂ x⌋ + 1 = k, czyli **⌊log₂ x⌋ = k - 1**, czyli x ma dokładnie k bitów.\n\nNajmniejsza liczba o k bitach to **2^(k-1)** (np. 1, 10, 100, 1000, w binarnym = 1, 2, 4, 8, ).\n\n## Sposób 2 - weryfikacja na przykładach\n\n### k = 1 wywołanie → x = 1\nNajmniejszy x dla 1 wywołania: x=1 (warunek bazowy). Sprawdzenie wzorów:\n- A: k² = 1 ✓\n- B: 2^(k-1) = 2^0 = 1 ✓\n- C: k+1 = 2 (za duże, x=1 wystarczy)\n- D: 2^k = 2 (za duże)\n\nDla k=1 dwa wzory pasują, więc trzeba większego k:\n\n### k = 4 wywołania (z przykładu w treści: licz(13) wymaga 4 wywołań)\n13 = 1101 (4 bity). Najmniejszy x z 4 bitami:\n- B: 2^(4-1) = **2^3 = 8** = 1000₂ (4 bity). 8 div 2 = 4 (3 bity), 4 div 2 = 2 (2 bity), 2 div 2 = 1 (1 bit). Wywołania: licz(8), licz(4), licz(2), licz(1) = 4 ✓\n- A: k² = 16 = 10000₂ (5 bitów) - za duże\n- C: k+1 = 5 = 101₂ (3 bity, czyli 3 wywołania) - za mało\n- D: 2^k = 16 (5 bitów) - za duże\n\n**Najmniejszy x z 4 wywołaniami = 8 = 2^(k-1).** ✓ Wzór B poprawny.\n\n### k = 5\n- B: 2^4 = 16 = 10000₂ (5 bitów) ✓\n- D: 2^5 = 32 = 100000₂ (6 bitów = 6 wywołań) ✗\n\n## Sposób 3 - dlaczego inne opcje błędne\n\n| Opcja | Wzór | Dlaczego błędna |\n| A | k² | k² rośnie kwadratowo, log₂(k²) = 2·log₂ k ≠ k-1 |\n| **B** | **2^(k-1)** | **POPRAWNA** - to najmniejsza liczba o k bitach |\n| C | k+1 | k+1 ma w bin ok. log₂(k+1) bitów ≪ k |\n| D | 2^k | 2^k ma k+1 bitów → k+1 wywołań (o jedno za dużo) |\n\n## Reference algorytmiczny - głębokość rekurencji binarnej\n\n> Reference - Rekurencja po dzieleniu na 2:\n> - Funkcja typu f(x) = f(x div 2) + ma głębokość log₂(x) + 1.\n> - Najmniejsza liczba o n bitach to 2^(n-1).\n> - Największa liczba o n bitach to 2^n - 1.\n> - Liczba k-bitowa: 2^(k-1) ≤ x ≤ 2^k - 1.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.2, max 2 pkt):\n> - **2 pkt** - za odpowiedź **B (x = 2^(k-1))**\n> - **1 pkt** - za 2^k (opcja D - wykazuje zrozumienie, ale przesunięcie o 1)\n> - **0 pkt** - A, C albo brak\n\n## Typowe pułapki\n\n- **Pomylenie 2^k z 2^(k-1)** - częsty błąd off-by-one. Dla k wywołań x musi mieć dokładnie k bitów. Liczby k-bitowe to [2^(k-1), 2^k - 1].\n- **Niezliczenie pierwszego wywołania** - treść mówi „licząc także pierwsze wywołanie licz(x)\", więc dla x=1 mamy 1 wywołanie, nie 0.\n- **Pomylenie kierunku log** - log₂(x) to wykładnik, nie liczba bitów (różnica 1).\n\n## Złożoność obliczeniowa\n\n- Liczba wywołań rekurencyjnych w licz(x): **⌊log₂ x⌋ + 1** (czyli liczba bitów x).\n- Czas każdego wywołania: O(1). Łączny czas: **O(log x)**.\n- Pamięć stosu: O(log x).","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-2.2.webp","solution_image":null,"topics":null,"page_from":5,"source":"ocr","answer_source":"maturazai","answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/2.3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"2.3","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 2.3. (0-2)\nPodaj najmniejszą liczbę całkowitą x większą od 100, dla której wynikiem wywołania\nlicz(x) będzie 0.\nOdpowiedź:\nMiejsce na obliczenia\nWypełnia\negzaminator\nNr zadania\n2.1.\n2.2.\n2.3.\nMaks. liczba pkt.\n2\n2\n2\nUzyskana liczba pkt.\nMIN_1R","answer":null,"answer_text":"Zadanie 2.3. (0-2)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […],\nz zastosowaniem podejścia algorytmicznego.\n5) posługuje się podstawowymi technikami\nalgorytmicznymi;\n9) stosuje rekurencję w prostych sytuacjach\nproblemowych\n16) opisuje własności algorytmów na\npodstawie ich analizy;\n17) ocenia zgodność algorytmu ze\nspecyfikacją problemu;\nSchemat punktowania\n2 p. - za prawidłową odpowiedź.\n1 p. - za podanie innej wartości większej od 100, dla której wynikiem działania algorytmu\nbędzie 0.\n0 p. - za podanie innej błędnej odpowiedzi albo brak odpowiedzi.\nPoprawna odpowiedź:\n135","solution":"## Poprawna odpowiedź\n\n**x = 135**\n\n135 w binarnym to **10000111** (8 bitów, 4 jedynki, 4 zera). licz(135) = 4 - 4 = 0.\n\n## Sposób 1 - wykorzystanie wzoru z 2.1\n\nZ zadania 2.1 wiemy: **licz(x) = (liczba jedynek w bin(x)) - (liczba zer w bin(x))**.\n\nlicz(x) = 0 oznacza: **liczba jedynek = liczba zer** w zapisie binarnym x.\n\n**Wniosek:** x musi mieć parzystą liczbę bitów (2k bitów: k jedynek i k zer). Najmłodszy bit może być 0 lub 1, najstarszy zawsze 1.\n\n## Sposób 2 - szukamy najmniejszego x > 100\n\n100 w binarnym = 1100100 (7 bitów). Szukamy x > 100 z równą liczbą 0 i 1.\n\nLiczby 8-bitowe (najmniejsza = 128 = 10000000) zakres: 128-255.\n\nDla x = 128, 129, , 135 sprawdzamy:\n- 128 = 10000000: 1 jedynka, 7 zer → licz = -6\n- 129 = 10000001: 2 j, 6 z → -4\n- 130 = 10000010: 2 j, 6 z → -4\n- 131 = 10000011: 3 j, 5 z → -2\n- 132 = 10000100: 2 j, 6 z → -4\n- 133 = 10000101: 3 j, 5 z → -2\n- 134 = 10000110: 3 j, 5 z → -2\n- **135 = 10000111: 4 j, 4 z → licz = 0** ✓\n\nMniejsze liczby? Sprawdźmy też 7-bitowe (64-127):\n- Liczba 7-bitowa ma 7 bitów; równa liczba 0 i 1 wymaga **parzystej liczby bitów** - niemożliwe!\n- Wszystkie 7-bitowe mają licz(x) parzyste? Tak: 7 = 1 + 6 lub 3 + 4 lub 5 + 2 lub 7 + 0 → różnica nieparzysta. Niemożliwe licz = 0.\n\nWięc x > 100 z licz = 0 musi być co najmniej 8-bitowe, czyli x ≥ 128. Sprawdzone - najmniejsze takie x to **135**.\n\n## Sposób 3 - weryfikacja symulacją (Python)\n\n```python\ndef licz(x):\nif x == 1:\nreturn 1\nw = licz(x // 2)\nif x % 2 == 1:\nreturn w + 1\nelse:\nreturn w - 1\n\nfor x in range(101, 200):\nif licz(x) == 0:\nprint(x)\nbreak\n# wynik: 135\n\nSymulacja licz(135) krok po kroku:\n- licz(135): bit=1 → w = licz(67), wynik = w+1\n- licz(67): bit=1 → w = licz(33), wynik = w+1\n- licz(33): bit=1 → w = licz(16), wynik = w+1\n- licz(16): bit=0 → w = licz(8), wynik = w-1\n- licz(8): bit=0 → w = licz(4), wynik = w-1\n- licz(4): bit=0 → w = licz(2), wynik = w-1\n- licz(2): bit=0 → w = licz(1), wynik = w-1\n- licz(1) = 1\n- licz(2) = 0; licz(4) = -1; licz(8) = -2; licz(16) = -3\n- licz(33) = -3 + 1 = -2\n- licz(67) = -2 + 1 = -1\n- licz(135) = -1 + 1 = **0** ✓\n\n## Reference algorytmiczny - bilans bitów\n\n> Reference - bilans bitów w zapisie binarnym:\n> - Suma j + z = liczba bitów (długość zapisu).\n> - Różnica j - z = licz(x) (z zadania 2.1).\n> - Aby j = z konieczne: parzysta długość zapisu. Najmniejsze x o takiej własności i > 100 to liczba 8-bitowa, najmłodsza spełniająca to 10000111 = 135.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.3, max 2 pkt):\n> - **2 pkt** - za **135**\n> - **1 pkt** - za inną liczbę x > 100, dla której licz(x) = 0 (np. 139, 141, 142, 147, )\n> - **0 pkt** - błąd lub brak\n\n## Typowe pułapki\n\n- **Próba 100-127** - żadna 7-bitowa liczba nie da licz = 0 (nieparzysta długość).\n- **Pominięcie wymogu „>100\"** - 51 = 110011 daje licz = 0, ale 51 < 100.\n- **Błąd rachunkowy w zliczeniu bitów** - 135 = 128 + 4 + 2 + 1 = 10000111 (bit 7 + bity 0-2).\n\n## Złożoność obliczeniowa\n\n- Bezpośrednie szukanie x w pętli: O((x_wynik - 100) · log x_wynik) ≈ O(35 · 8) = O(280) - trywialne.","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-2.3.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 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"3","points":null,"ptype":"true_false","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 3. Test\nOceń prawdziwość podanych zdań. Zaznacz P, jeśli zdanie jest prawdziwe, albo F - jeśli jest\nfałszywe.\nW każdym zadaniu punkt uzyskasz tylko za komplet poprawnych odpowiedzi.","answer":null,"answer_text":null,"solution":null,"image":"img/informatyka-2017-maj-matura-rozszerzona/zad-3.webp","solution_image":null,"topics":null,"page_from":6,"source":"ocr","answer_source":null,"answer_text_source":null,"solution_source":null,"text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/3.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"3.1","points":1,"ptype":"true_false","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 3.1. (0-1)\nPo wykonaniu podanego zapytania SQL do pewnej bazy danych wyniki będą zawsze\nuporządkowane niemalejąco według pola nazwa.\n1.\nSELECT nazwa, wartosc FROM dane ORDER BY wartosc, nazwa\nP\nF\n2.\nSELECT nazwa, wartosc FROM dane ORDER BY nazwa\nP\nF\n3.\nSELECT nazwa, sum(wartosc) FROM dane GROUP BY nazwa\nP\nF\n4.\nSELECT nazwa, sum(wartosc) FROM dane GROUP BY nazwa\nORDER BY nazwa\nP\nF","answer":null,"answer_text":"Zadanie 3.1. (0-1)\nIII Rozwiązywanie problemów\ni podejmowanie decyzji z wykorzystaniem\nkomputera, z zastosowaniem podejścia\nalgorytmicznego.\n2. Wyszukiwanie, gromadzenie,\nselekcjonowanie, przetwarzanie\ni wykorzystywanie informacji,\nwspółtworzenie zasobów w sieci,\nkorzystanie z różnych źródeł i sposobów\nzdobywania informacji.\nZdający:\n2) stosuje metody wyszukiwania\ni przetwarzania informacji w relacyjnej bazie\ndanych (język SQL);\nSchemat punktowania\n1 p. - za wskazanie czterech poprawnych odpowiedzi.\n0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.\nPoprawna odpowiedź\nF, P, F, P.","solution":"## Poprawna odpowiedź\n\n| # | Zapytanie | Sortowanie po `nazwa` | Ocena |\n| 1 | `ORDER BY wartosc, nazwa` | NIE - głównie po wartosc | **F** |\n| 2 | `ORDER BY nazwa` | TAK - bezpośrednio | **P** |\n| 3 | `GROUP BY nazwa` (bez ORDER BY) | NIE GWARANTOWANE | **F** |\n| 4 | `GROUP BY nazwa ORDER BY nazwa` | TAK | **P** |\n\n**Wynik: F, P, F, P**\n\n## Sposób 1 - analiza klauzuli ORDER BY\n\n**Zapytanie 1:** `ORDER BY wartosc, nazwa`\n- Sortowanie najpierw po `wartosc`, dopiero przy remisach - po `nazwa`.\n- Wyniki NIE są uporządkowane niemalejąco po samej `nazwa` (np. wartości {(B, 1), (A, 2)} dadzą porządek (B, 1), (A, 2), gdzie B < A jest fałszem).\n- **F**\n\n**Zapytanie 2:** `ORDER BY nazwa`\n- ORDER BY bez kierunku domyślnie sortuje rosnąco (ASC).\n- Wyniki uporządkowane niemalejąco po `nazwa` ✓.\n- **P**\n\n**Zapytanie 3:** `GROUP BY nazwa` (bez ORDER BY)\n- W standardzie SQL klauzula GROUP BY **nie gwarantuje** porządku wyników - to detal implementacyjny silnika bazy danych.\n- Bez `ORDER BY` kolejność może być dowolna (zwykle dla wydajności).\n- **F**\n\n**Zapytanie 4:** `GROUP BY nazwa ORDER BY nazwa`\n- GROUP BY grupuje, a ORDER BY na końcu wymusza sortowanie po nazwa.\n- Wyniki uporządkowane niemalejąco po `nazwa` ✓.\n- **P**\n\n## Sposób 2 - przykład danych pokazujący różnicę\n\nDane:\n| nazwa | wartosc |\n| Zofia | 1 |\n| Anna | 2 |\n| Beata | 1 |\n\n**Zapytanie 1 (ORDER BY wartosc, nazwa):**\nBeata | 1\nZofia | 1\nAnna | 2\nPo nazwa: Beata, Zofia, Anna - NIE jest niemalejąco (Zofia > Anna).\n\n**Zapytanie 2 (ORDER BY nazwa):**\nAnna | 2\nBeata | 1\nZofia | 1\nNiemalejąco po nazwa ✓.\n\n**Zapytanie 3 (GROUP BY nazwa, bez ORDER BY):**\nPorządek niezdefiniowany. Może być Beata, Anna, Zofia lub jakkolwiek inaczej.\n\n**Zapytanie 4 (GROUP BY nazwa ORDER BY nazwa):**\nAnna | 2\nBeata | 1\nZofia | 1\nNiemalejąco ✓.\n\n## Reference algorytmiczny - semantyka SQL\n\n> Reference - porządek wyników w SQL:\n> - **Bez ORDER BY** silnik SQL może zwrócić wiersze w DOWOLNEJ kolejności (zwykle nieprzewidywalnej, zależnej od planu wykonania, indeksów, partycjonowania).\n> - **ORDER BY kolumna** sortuje rosnąco po danej kolumnie (domyślnie ASC).\n> - **ORDER BY a, b** sortuje najpierw po a; przy remisach po b.\n> - **GROUP BY** grupuje wiersze, ale NIE narzuca kolejności wyjścia (mimo że w niektórych RDBMS, np. starszym MySQL, była niejawna kolejność po polach grupujących - w nowych wersjach już nie).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 3.1, max 1 pkt):\n> - **1 pkt** - za KOMPLET poprawnych odpowiedzi: F, P, F, P\n> - **0 pkt** - za odpowiedź niepełną/błędną lub brak\n\n## Typowe pułapki\n\n- **Zapytanie 3 (P zamiast F)** - najczęstszy błąd. Uczeń myśli „GROUP BY grupuje po nazwa, więc wyniki są po nazwa\". To MIT - bez ORDER BY porządek nie jest gwarantowany.\n- **Zapytanie 1 (P zamiast F)** - myślenie „ORDER BY zawiera nazwa, więc OK\". Ale nazwa jest DRUGIM kryterium - pierwszy jest wartosc, więc po nazwa wyniki niekoniecznie są uporządkowane.\n- **Niemalejąco vs rosnąco** - „niemalejąco\" oznacza „rosnąco lub równo\" (≤), czyli to samo co default ASC.\n\n## Złożoność obliczeniowa\n\n- Sortowanie wyników SQL po klauzuli ORDER BY: zwykle O(n log n).\n- GROUP BY: O(n log n) z indeksem na kolumnie lub O(n) z hash-aggregate.","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-3.1.webp","solution_image":null,"topics":null,"page_from":6,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/3.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"3.2","points":1,"ptype":"true_false","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 3.2. (0-1)\nRozważ następujące zapytanie SQL do pewnej bazy danych:\nSELECT pesel, COUNT(*)\nFROM samochody\nWHERE pesel NOT IN (SELECT pesel FROM dokumenty_zastrzezone)\nGROUP BY pesel HAVING COUNT(*) > 1\nPo wykonaniu tego zapytania w odpowiedzi\n1.\nten sam numer PESEL może pojawić więcej niż jeden raz.\nP\nF\n2.\nnie pojawi się żaden numer PESEL, który jest zapisany w tabeli\ndokumenty_zastrzezone.\nP\nF\n3.\notrzymasz tabelę o 2 kolumnach.\nP\nF\n4.\nprzy odpowiednich danych może pojawić się wiersz\n„82122302134, 1”.\nP\nF\nUwaga: kolumna pesel zawiera numery PESEL.\nMIN_1R","answer":"F","answer_text":"Zadanie 3.2. (0-1)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […],\nz zastosowaniem podejścia algorytmicznego.\n2. Wyszukiwanie, gromadzenie,\nselekcjonowanie, przetwarzanie\ni wykorzystywanie informacji,\nwspółtworzenie zasobów w sieci,\nkorzystanie z różnych źródeł i sposobów\nzdobywania informacji.\nZdający:\n2) stosuje metody wyszukiwania\ni przetwarzania informacji w relacyjnej bazie\ndanych (język SQL);\nSchemat punktowania\n1 p. - za wskazanie czterech poprawnych odpowiedzi.\n0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.\nPoprawna odpowiedź\nF, P, P, F.","solution":"## Poprawna odpowiedź\n\n**F, P, P, F**\n\n## Sposób 1 - analiza zapytania SQL\n\n```sql\nSELECT pesel, COUNT(*)\nFROM samochody\nWHERE pesel NOT IN (SELECT pesel FROM dokumenty_zastrzezone)\nGROUP BY pesel HAVING COUNT(*) > 1\n\n**Krok po kroku:**\n1. Z tabeli `samochody` wybieramy wiersze, gdzie `pesel` NIE występuje w `dokumenty_zastrzezone`.\n2. Grupujemy wynik po `pesel` (każdy PESEL pojawi się dokładnie raz w grupie).\n3. Filtr `HAVING COUNT(*) > 1` zostawia tylko grupy o liczności > 1 (co najmniej 2 samochody).\n4. Wynikowa tabela ma 2 kolumny: pesel i COUNT(*).\n\n## Sposób 2 - analiza każdego stwierdzenia\n\n### Stwierdzenie 1: „Ten sam numer PESEL może pojawić więcej niż jeden raz.\"\n- **GROUP BY pesel** powoduje, że każdy PESEL pojawia się DOKŁADNIE JEDEN RAZ w wynikach.\n- **F** ✓\n\n### Stwierdzenie 2: „Nie pojawi się żaden numer PESEL, który jest zapisany w tabeli dokumenty_zastrzezone.\"\n- Klauzula `WHERE pesel NOT IN (SELECT pesel FROM dokumenty_zastrzezone)` wyklucza takie PESELe PRZED grupowaniem.\n- **P** ✓\n\n### Stwierdzenie 3: „Otrzymasz tabelę o 2 kolumnach.\"\n- `SELECT pesel, COUNT(*)` → dwie kolumny: pesel i count.\n- **P** ✓\n\n### Stwierdzenie 4: „Przy odpowiednich danych może pojawić się wiersz „82122302134, 1\".\"\n- Klauzula `HAVING COUNT(*) > 1` wyklucza wiersze z licznikiem = 1. Wiersz „pesel, 1\" jest NIEMOŻLIWY w wynikach.\n- **F** ✓\n\n## Sposób 3 - kontekst biznesowy zapytania\n\nZapytanie zwraca: właścicieli (PESEL), którzy mają **co najmniej 2 samochody** (COUNT > 1) i których dokumenty NIE są zastrzeżone (NOT IN dokumenty_zastrzezone). To typowy raport np. dla urzędu pojazdów.\n\n## Reference algorytmiczny - semantyka WHERE vs HAVING\n\n> Reference - WHERE vs HAVING:\n> - **WHERE** - filtr na pojedynczych wierszach PRZED grupowaniem.\n> - **GROUP BY** - grupowanie wierszy po wartościach kolumny.\n> - **HAVING** - filtr na grupach PO grupowaniu (może używać funkcji agregujących COUNT, SUM, AVG, MIN, MAX).\n> - Kolejność wykonania: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.\n\n> Reference - NOT IN:\n> - `pesel NOT IN (podzapytanie)` - wybierz wiersze, których pesel NIE występuje w wyniku podzapytania.\n> - Uwaga: jeśli podzapytanie zwraca NULL, NOT IN może dawać nieoczekiwane wyniki (3-wartościowa logika SQL).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 3.2, max 1 pkt):\n> - **1 pkt** - za KOMPLET 4 poprawnych odpowiedzi: F, P, P, F\n> - **0 pkt** - odpowiedź niepełna/błędna albo brak\n\n## Typowe pułapki\n\n- **Stwierdzenie 1 (P zamiast F)** - uczeń myśli „w tabeli samochody PESEL może powtarzać się\". Tak, ale po GROUP BY każdy PESEL pojawi się raz. Mylenie tabeli wejściowej z wyjściową.\n- **Stwierdzenie 4 (P zamiast F)** - przeoczenie HAVING COUNT(*) > 1. Wiersz z licznikiem 1 jest NIEMOŻLIWY w wynikach.\n- **NOT IN i NULL** - szczegół zaawansowany: gdy podzapytanie zawiera NULL, NOT IN może zwrócić puste wyniki (poza zakresem testu, ale dobrze wiedzieć).\n\n## Złożoność obliczeniowa\n\n- WHERE z NOT IN + GROUP BY + HAVING: typowo O(n log n) lub O(n) z hash-aggregate i indeksem na pesel.\n- NOT IN nieoptymalnie skompilowane może być O(n²) - lepsze: LEFT JOIN WHERE IS NULL lub NOT EXISTS.","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-3.2.webp","solution_image":null,"topics":null,"page_from":6,"source":"ocr","answer_source":"maturazai","answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/3.3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"3.3","points":1,"ptype":"true_false","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 3.3. (0-1)\nPewien oszust chce rozesłać wiadomość, podszywając się pod Jana Kowalskiego, ale nie zdołał\nwykraść żadnych należących do Jana haseł ani innych prywatnych informacji. Posiada jednak\nklucz publiczny Jana Kowalskiego, który ten udostępnił w sieci, a także znaleziony w internecie\nadres e-mail Jana. Może zatem\n1.\nzałożyć konto „Jan Kowalski” w serwisie społecznościowym i stamtąd\nrozsyłać wiadomości.\nP\nF\n2.\nna podstawie klucza publicznego Jana Kowalskiego szybko\nwygenerować jego podpis cyfrowy.\nP\nF\n3.\nna podstawie klucza publicznego Jana Kowalskiego szybko obliczyć\njego klucz prywatny.\nP\nF\n4.\nrozsyłać listy elektroniczne, które w nagłówku „Od:” będą miały adres\ne-mail Jana Kowalskiego.\nP\nF\nWypełnia\negzaminator\nNr zadania\n3.1.\n3.2.\n3.3.\nMaks. liczba pkt.\n1\n1\n1\nUzyskana liczba pkt.\nMIN_1R\nBRUDNOPIS (nie podlega ocenie)","answer":null,"answer_text":"Zadanie 3.3. (0-1)\nI. Bezpieczne posługiwanie się komputerem\ni jego oprogramowaniem, wykorzystanie\nsieci komputerowej; komunikowanie się za\npomocą komputera i technologii\ninformacyjno-komunikacyjnych.\nV. Ocena zagrożeń i ograniczeń, docenianie\nspołecznych aspektów rozwoju i zastosowań\ninformatyki.\nI.1. Bezpieczne posługiwanie się\nkomputerem, jego oprogramowaniem\ni korzystanie z sieci komputerowej. Uczeń:\n3) określa ustawienia sieciowe danego\nkomputera i jego lokalizacji w sieci,\nprawidłowo posługuje się terminologią\nsieciową,\nV.7. Uczeń wykorzystuje komputer\ni technologie informacyjno-komunikacyjne\ndo rozwijania swoich zainteresowań, opisuje\nzastosowania informatyki, ocenia zagrożenia\ni ograniczenia, docenia aspekty społeczne\nrozwoju i zastosowań informatyki:\n3) stosuje normy etyczne i prawne związane\nz rozpowszechnianiem programów\nkomputerowych, bezpieczeństwem i ochroną\ndanych oraz informacji w komputerze\ni w sieciach komputerowych;\n4) omawia zagadnienia przestępczości\nkomputerowej, w tym piractwo\nkomputerowe, nielegalne transakcje w sieci;\nSchemat punktowania\n1 p. - za wskazanie czterech poprawnych odpowiedzi.\n0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.\nPoprawna odpowiedź\nP, F, F, P.\nCzęść II\nUwaga: wszystkie wyniki muszą być odzwierciedleniem dołączonej komputerowej realizacji\nobliczeń.","solution":"## Poprawna odpowiedź\n\n**P, F, F, P**\n\n## Sposób 1 - analiza każdego stwierdzenia z perspektywy kryptografii\n\n### Stwierdzenie 1: „Założyć konto «Jan Kowalski» w serwisie społecznościowym \"\n- **Większość serwisów społecznościowych** nie weryfikuje tożsamości użytkownika kryptograficznie.\n- Wystarczy wpisać imię i nazwisko Jan Kowalski podczas rejestracji - żadna kryptografia nie jest wymagana.\n- **P** ✓\n\n### Stwierdzenie 2: „Na podstawie klucza publicznego szybko wygenerować jego podpis cyfrowy.\"\n- **Podpis cyfrowy wymaga klucza PRYWATNEGO** (asymetryczna kryptografia: prywatny podpisuje, publiczny weryfikuje).\n- Mając tylko klucz publiczny, oszust może JEDYNIE WERYFIKOWAĆ cudze podpisy, ale NIE może składać podpisu Jana.\n- **F** ✓\n\n### Stwierdzenie 3: „Na podstawie klucza publicznego szybko obliczyć jego klucz prywatny.\"\n- Bezpieczeństwo RSA opiera się na trudności **faktoryzacji dużych liczb** (np. iloczyn dwóch dużych liczb pierwszych).\n- Mając klucz publiczny RSA (n, e), aby wyliczyć prywatny (n, d), trzeba **rozłożyć n na czynniki pierwsze p i q**. Dla n długości 2048+ bitów to **obliczeniowo niewykonalne** klasycznymi komputerami w rozsądnym czasie.\n- Inne schematy (ECDSA, ElGamal) bazują na problemie logarytmu dyskretnego - równie trudnym.\n- **F** ✓\n\n### Stwierdzenie 4: „Rozsyłać listy elektroniczne w nagłówku «Od:» Jan Kowalski.\"\n- Pole **«From:»** w nagłówku SMTP jest TRYWIALNE do podrobienia (e-mail spoofing).\n- Protokoły SMTP w wersji klasycznej NIE wymagają uwierzytelnienia nadawcy w nagłówku.\n- Defence: SPF, DKIM, DMARC - ale to konfiguracja serwera odbiorcy, a oszust może wysłać list z dowolnego serwera.\n- **P** ✓\n\n## Sposób 2 - Reference: kryptografia asymetryczna\n\n**Para kluczy w RSA / ECC:**\n- **Klucz publiczny (public key)** - UDOSTĘPNIANY publicznie. Służy do:\n- **szyfrowania** wiadomości adresowanej do właściciela (tylko on, klucz prywatny, może odszyfrować),\n- **weryfikacji** podpisu cyfrowego stworzonego kluczem prywatnym.\n- **Klucz prywatny (private key)** - TYLKO U WŁAŚCICIELA. Służy do:\n- **odszyfrowania** wiadomości szyfrowanych jego kluczem publicznym,\n- **podpisywania** wiadomości (tworzenia podpisu cyfrowego).\n\n**Bezpieczeństwo:** Z klucza publicznego nie da się (w praktyce) wyliczyć prywatnego - to fundament całej kryptografii klucza publicznego.\n\n## Reference algorytmiczny - kryptografia\n\n> Reference - RSA i kryptografia asymetryczna:\n> - Generowanie: losuj duże liczby pierwsze p, q; n = p·q. e = 65537 (typowo). d = e⁻¹ mod φ(n). Klucz publiczny: (n, e). Prywatny: (n, d).\n> - Szyfrowanie: c = m^e mod n. Odszyfrowanie: m = c^d mod n.\n> - Podpis: σ = m^d mod n (z kluczem prywatnym). Weryfikacja: m = σ^e mod n (z publicznym).\n> - Bezpieczeństwo: zależy od trudności faktoryzacji n. Klucz 2048-bitowy uznawany za bezpieczny do ~2030.\n\n> Reference - e-mail spoofing:\n> - Nagłówek SMTP `From:` jest podstawowo niewerifikowany.\n> - Obrony: SPF (Sender Policy Framework), DKIM (DomainKeys Identified Mail), DMARC.\n> - Skuteczność obrony zależy od konfiguracji serwera odbiorczego.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 3.3, max 1 pkt):\n> - **1 pkt** - za KOMPLET poprawnych: P, F, F, P\n> - **0 pkt** - niepełne/błędne lub brak\n\n## Typowe pułapki\n\n- **Stwierdzenie 2 (P zamiast F)** - mylenie funkcji klucza publicznego z prywatnego. **Publiczny weryfikuje, prywatny podpisuje** - nie na odwrót.\n- **Stwierdzenie 3 (P zamiast F)** - myślenie, że klucze są symetryczne lub że da się je „odzyskać\". W praktyce niemożliwe (problem faktoryzacji NP-trudny? - nie wiadomo, ale empirycznie niewykonalne).\n- **Stwierdzenie 1 (F zamiast P)** - przesadne zaufanie do serwisów społecznościowych. Większość nie weryfikuje tożsamości w sposób kryptograficzny (poza specjalnymi serwisami typu Verified Identity).\n- **Stwierdzenie 4 (F zamiast P)** - niewiedza o trywialności e-mail spoofingu. Bez DKIM/SPF każdy może sfałszować From:.\n\n## Złożoność obliczeniowa\n\n- Faktoryzacja n-bitowej liczby (klasyczny komputer, GNFS): **sub-wykładnicza, ale praktycznie niewykonalna** dla n=2048+.\n- Shor's algorithm (kwantowy): **O((log n)³)** - niszczy RSA, ale wymaga kwantowego komputera o wystarczającej liczbie kubitów (jeszcze niedostępny w skali).\n- Klasyczne łamanie RSA-2048: szacowane na ~3·10¹⁰ lat (lat = stulecie wszechświata wiele razy).","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-3.3.webp","solution_image":null,"topics":null,"page_from":7,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.1","points":1,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 4. Słodzik\n\nFirma Słodzik zajmuje się sprzedażą cukru. W pliku cukier.txt znajdują się 2162 wiersze z danymi dotyczącymi sprzedaży w latach 2005-2014. W każdym wierszu podane są dane opisujące jedną transakcję sprzedaży, oddzielone pojedynczymi znakami tabulacji: data sprzedaży (rrrr-mm-dd), numer NIP klienta (13-znakowy tekst) i ilość sprzedanego cukru w kg (co najwyżej 3-cyfrowa liczba całkowita dodatnia). Transakcje są uporządkowane niemalejąco według daty.\n\nPrzykład:\n2005-01-01 | 872-13-44-365 | 10\n2005-01-04 | 369-43-03-176 | 2\n\nFirma Słodzik ustala cenę sprzedaży w złotych na początku roku. Ustalona cena obowiązuje przez cały rok. W pliku cennik.txt przedstawiono ceny sprzedaży 1 kg cukru ustalone przez firmę Słodzik w latach 2005-2014.\n\nPrzykład cennik:\n2005 | 2,00\n2006 | 2,05\n2007 | 2,09\n\nPodaj numery NIP trzech klientów, którzy w całym okresie 2005-2014 kupili łącznie najwięcej cukru. Dla każdego z tych klientów podaj łączną liczbę kilogramów zakupionego przez niego cukru.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n| NIP | Łączna liczba kg cukru |\n| **254-14-00-156** | **27 505** |\n| **847-48-41-699** | **26 955** |\n| **392-78-93-552** | **26 451** |\n\n## Sposób 1 - Python (agregacja słownikiem)\n\n```python\nfrom collections import defaultdict\n\nsumy = defaultdict(int)\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg = linia.strip().split('\\t')\nsumy[nip] += int(kg)\n\n# Trzech największych\ntop3 = sorted(sumy.items(), key=lambda x: -x[1])[:3]\nfor nip, kg in top3:\nprint(nip, kg)\n\nWynik:\n254-14-00-156 27505\n847-48-41-699 26955\n392-78-93-552 26451\n\n## Sposób 2 - SQL\n\nZakładając, że `cukier.txt` zaimportowano do tabeli `sprzedaz(data, nip, kg)`:\n\n```sql\nSELECT nip, SUM(kg) AS suma\nFROM sprzedaz\nGROUP BY nip\nORDER BY suma DESC\nLIMIT 3;\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. Wczytaj cukier.txt jako 3 kolumny: A (data), B (NIP), C (kg).\n2. Pobierz unikalne NIPy w kolumnę E (Data → Usuń duplikaty z B).\n3. W F2: `=SUMA.JEŻELI(B:B; E2; C:C)` - łączna suma kg per NIP.\n4. Posortuj E:F malejąco po F.\n5. Wynik: 3 pierwsze wiersze.\n\nAlternatywnie tabela przestawna: Wiersze = NIP, Wartości = SUMA kg → sortowanie malejące.\n\n## Sposób 4 - Pascal\n\n```pascal\nprogram Slodzik41;\nuses sysutils;\nvar\nf: TextFile;\ndata, nip: string;\nkg, i, j, n: LongInt;\nnipy: array[1 3000] of string;\nsumy: array[1 3000] of LongInt;\nfound: Boolean;\ntmpS: string; tmpL: LongInt;\nbegin\nn := 0;\nAssignFile(f, 'cukier.txt');\nReset(f);\nwhile not Eof(f) do\nbegin\nReadLn(f, data); // czyta cały wiersz, należy sparsować\n// [parsowanie split po tabulatorze omijam dla zwięzłości]\n// szukaj nip w tablicy; jeśli nie ma - dodaj\nend;\nCloseFile(f);\n// sortuj nipy malejąco po sumy (np. bubble)\n// wypisz pierwsze 3\nend.\n\n## Reference algorytmiczny - agregacja danych\n\n> Reference - agregacja grupowa (group by):\n> - W Python: `collections.defaultdict(int)` lub `collections.Counter` dla zliczeń.\n> - W SQL: `GROUP BY + agregat` (SUM, COUNT, AVG).\n> - W arkuszu: `SUMA.JEŻELI` lub tabela przestawna.\n> - Top-N: sortowanie malejąco i wzięcie pierwszych N.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.1, max 1 pkt):\n> - **1 pkt** - za podanie 3 NIPów Z prawidłowymi sumami kg\n> - **0 pkt** - odpowiedź niepełna lub błędna albo brak\n\n## Typowe pułapki\n\n- **Format separatora** - w pliku separator to **tabulacja (\\t)**, nie spacja czy przecinek. W Python `split('\\t')`.\n- **Kolejność sortowania** - sortuj malejąco po sumie kg, nie po NIP.\n- **Konwersja liczby kg** - kg to liczba całkowita, użyj `int(kg)` lub `parseInt`.\n- **Klucz CKE może mieć inny porządek** - kolejność trzech klientów w odpowiedzi może się różnić, ale wszystkie 3 NIPy i wartości muszą być poprawne.\n\n## Złożoność obliczeniowa\n\n- Pojedyncze przejście pliku + agregacja w słowniku: **O(n)**, gdzie n = liczba transakcji (2162).\n- Sortowanie unikalnych NIPów: O(k log k), gdzie k = liczba unikalnych klientów.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nPrzychód z pojedynczej sprzedaży to cena sprzedaży pomnożona przez liczbę kilogramów sprzedanego cukru. Oblicz łączny przychód firmy Słodzik w latach 2005-2014.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Łączny przychód: 643 267,07 zł**\n\nZestawienie roczne:\n\n| Rok | Przychód |\n| 2005 | 54 032,00 |\n| 2006 | 55 813,30 |\n| 2007 | 66 294,80 |\n| 2008 | 78 524,45 |\n| 2009 | 65 527,32 |\n| 2010 | 68 294,10 |\n| 2011 | 52 311,60 |\n| 2012 | 60 696,00 |\n| 2013 | 63 090,18 |\n| 2014 | 78 683,32 |\n| **RAZEM** | **643 267,07** |\n\n## Sposób 1 - Python\n\n```python\n# Wczytaj cennik (rok → cena/kg)\ncennik = {}\nwith open('cennik.txt', encoding='utf-8') as f:\nfor linia in f:\nrok, cena = linia.strip().split('\\t')\ncennik[int(rok)] = float(cena.replace(',', '.'))\n\n# Wczytaj transakcje i mnóż przez cenę za rok\nlaczny = 0.0\nper_rok = {r: 0.0 for r in range(2005, 2015)}\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg = linia.strip().split('\\t')\nrok = int(data[:4])\nprzychod = int(kg) * cennik[rok]\nlaczny += przychod\nper_rok[rok] += przychod\n\nfor r in sorted(per_rok):\nprint(r, round(per_rok[r], 2))\nprint('RAZEM:', round(laczny, 2))\n# RAZEM: 643267.07\n\n## Sposób 2 - arkusz kalkulacyjny\n\n1. **cennik.txt** zaimportuj do osobnej tabeli: A=Rok, B=Cena (zamień przecinek na kropkę dziesiętną).\n2. **cukier.txt** zaimportuj: A=Data, B=NIP, C=Kg.\n3. Dodaj kolumnę D: `=WARTOŚĆ(LEWY(A2; 4))` - wyciągnięcie roku z daty.\n4. Dodaj kolumnę E: `=WYSZUKAJ.PIONOWO(D2; cennik!$A$2:$B$11; 2; FAŁSZ) * C2` - przychód jednej transakcji.\n5. Suma kolumny E daje **643267,07 zł**.\n\nAlternatywnie tabela przestawna z polem obliczanym `kg * cena_z_cennika_per_rok`.\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram Slodzik42;\nuses sysutils;\nvar\nf, fc: TextFile;\nrok, kg: LongInt;\ncena, przychod, laczny: Real;\ndata, nip, line: string;\ncennikRok: array[2005 2014] of Real;\ni: Integer;\nbegin\nAssignFile(fc, 'cennik.txt');\nReset(fc);\nwhile not Eof(fc) do\nbegin\nReadLn(fc, line); // np. \"2005\\t2,00\"\nrok := StrToInt(Copy(line, 1, 4));\ncena := StrToFloat(Copy(line, 6, Length(line))); // z przecinkiem\ncennikRok[rok] := cena;\nend;\nCloseFile(fc);\n\nlaczny := 0;\nAssignFile(f, 'cukier.txt');\nReset(f);\nwhile not Eof(f) do\nbegin\nReadLn(f, line); // \"data\\tNIP\\tkg\"\n// parsowanie split tabulacją (omijam dla zwięzłości)\nrok := StrToInt(Copy(line, 1, 4));\n// wyciągnij kg z końca\nprzychod := kg * cennikRok[rok];\nlaczny := laczny + przychod;\nend;\nCloseFile(f);\nWriteLn('Łączny przychód: ', laczny:0:2); // 643267.07\nend.\n\n## Sposób 4 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <map>\n#include <string>\n#include <sstream>\nusing namespace std;\n\nint main() {\nmap<int, double> cennik;\nifstream fc(\"cennik.txt\");\nint rok;\nstring cenaS;\nwhile (fc >> rok >> cenaS) {\nfor (auto& c : cenaS) if (c == ',') c = '.';\ncennik[rok] = stod(cenaS);\n}\n\ndouble laczny = 0;\nifstream f(\"cukier.txt\");\nstring data, nip;\nint kg;\nwhile (f >> data >> nip >> kg) {\nint r = stoi(data.substr(0, 4));\nlaczny += kg * cennik[r];\n}\ncout.precision(2);\ncout << fixed << laczny << endl; // 643267.07\nreturn 0;\n}\n\n## Reference algorytmiczny - join danych\n\n> Reference - łączenie danych z dwóch źródeł (lookup):\n> - W Python: słownik `cennik[rok] = cena` - O(1) wyszukiwanie.\n> - W SQL: JOIN po roku.\n> - W arkuszu: WYSZUKAJ.PIONOWO (VLOOKUP).\n> - Konwersja \"2,00\" → 2.0: zamień przecinek na kropkę, potem `float()`.\n> - Wydobycie roku z daty: `data[:4]` w Python, `LEWY(A; 4)` w arkuszu, `Copy(s, 1, 4)` w Pascal.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.2, max 2 pkt):\n> - **2 pkt** - łączny przychód **643 267,07 zł**\n> - **1 pkt** - poprawne zestawienie przychodów w poszczególnych latach (wartości roczne) ale błędna suma\n> - **0 pkt** - inna błędna odpowiedź albo brak\n\n## Typowe pułapki\n\n- **Separator dziesiętny** - w cenniku format polski („2,00\"), trzeba zamienić na kropkę przed konwersją do float.\n- **Format daty** - wystarczy pierwsze 4 znaki dla wydobycia roku, nie potrzeba parsować całej daty.\n- **Sumowanie zmiennoprzecinkowe** - przy dodawaniu ~2000 liczb mogą wystąpić drobne błędy zaokrąglenia; finalnie zaokrąglić do 2 miejsc po przecinku.\n- **Pomyłka cennika** - cena obowiązuje przez cały rok, więc grupowanie po roku z daty transakcji.\n\n## Złożoność obliczeniowa\n\n- Wczytanie cennika: O(10) - stała.\n- Pojedyncze przejście transakcji + lookup w słowniku: **O(n)**, gdzie n = liczba transakcji (2162).\n- Łączna złożoność: **O(n)**.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.3","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nWykonaj i podaj zestawienie ilości sprzedanego cukru w kolejnych latach, od roku 2005 do roku 2014 włącznie. Następnie utwórz wykres liniowy ilustrujący sprzedaż cukru w kolejnych latach w podanym okresie. Wyskaluj oś pionową co 5000 kg. Pamiętaj o czytelnym opisie wykresu (tytuł i opis osi).","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Zestawienie ilości sprzedanego cukru:**\n\n| Rok | Sprzedaż (kg) |\n| 2005 | 27 016 |\n| 2006 | 27 226 |\n| 2007 | 31 720 |\n| 2008 | 36 523 |\n| 2009 | 30 764 |\n| 2010 | 32 521 |\n| 2011 | 23 778 |\n| 2012 | 26 976 |\n| 2013 | 28 419 |\n| 2014 | 35 284 |\n\nWykres liniowy z osią pionową wyskalowaną co 5000 kg, tytułem „Sprzedaż cukru w latach 2005-2014\", osi X opisaną „Rok\" i osi Y opisaną „Sprzedaż [kg]\".\n\n## Sposób 1 - arkusz kalkulacyjny (LibreOffice/Excel)\n\n1. **Wczytaj cukier.txt** - kolumny: A=Data, B=NIP, C=Kg.\n2. **Wydobądź rok** - w D2: `=WARTOŚĆ(LEWY(A2; 4))`.\n3. **Lista lat** w F2:F11 - wartości 2005, 2006, , 2014.\n4. **Suma per rok** w G2: `=SUMA.JEŻELI($D$2:$D$2163; F2; $C$2:$C$2163)`. Skopiuj na G3:G11.\n5. **Wykres liniowy:**\n- Zaznacz F1:G11.\n- Wstaw → Wykres → Linia (z markerami).\n- **Tytuł wykresu:** „Sprzedaż cukru w latach 2005-2014\".\n- **Oś X:** „Rok\".\n- **Oś Y:** „Sprzedaż [kg]\".\n- **Skalowanie osi Y:** kliknij prawym → Właściwości → Skala → Główna jednostka: 5000.\n\n## Sposób 2 - Python z matplotlib\n\n```python\nimport matplotlib.pyplot as plt\nfrom collections import defaultdict\n\nsumy = defaultdict(int)\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg = linia.strip().split('\\t')\nsumy[int(data[:4])] += int(kg)\n\nlata = sorted(sumy.keys())\nilosci = [sumy[r] for r in lata]\n\nfor r, k in zip(lata, ilosci):\nprint(r, k)\n\nplt.figure(figsize=(10, 6))\nplt.plot(lata, ilosci, marker='o', linewidth=2)\nplt.title('Sprzedaż cukru w latach 2005-2014')\nplt.xlabel('Rok')\nplt.ylabel('Sprzedaż [kg]')\nplt.yticks(range(0, max(ilosci) + 5000, 5000)) # oś co 5000\nplt.grid(True)\nplt.savefig('wykres_cukier.png', dpi=150, bbox_inches='tight')\nplt.show()\n\nOutput:\n2005 27016\n2006 27226\n2007 31720\n2008 36523\n2009 30764\n2010 32521\n2011 23778\n2012 26976\n2013 28419\n2014 35284\n\n## Sposób 3 - SQL (dla wsparcia obliczenia)\n\nJeśli cukier.txt jest w tabeli `sprzedaz`:\n```sql\nSELECT YEAR(data) AS rok, SUM(kg) AS sprzedaz\nFROM sprzedaz\nGROUP BY YEAR(data)\nORDER BY rok;\n\n## Reference algorytmiczny - wizualizacja danych szeregu czasowego\n\n> Reference - wykres liniowy w arkuszu:\n> - **Wykres liniowy** = punkty połączone liniami, idealny do trendów czasowych.\n> - **Skalowanie osi**: Excel/LibreOffice → Format osi → Główna jednostka (Major unit).\n> - **Czytelność**: tytuł, etykiety osi, jednostki w nawiasach, legenda (jeśli wiele serii).\n> - W matplotlib: `plt.yticks(range(min, max, krok))`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.3, max 3 pkt):\n> - **3 pkt** - pełna poprawna odpowiedź, w tym:\n> - 1 pkt - prawidłowe zestawienie liczbowe (10 wartości rocznych)\n> - 1 pkt - prawidłowy dobór danych i typ wykresu (liniowy)\n> - 1 pkt - poprawny opis (tytuł + osie) i wyskalowanie osi pionowej co 5000\n> - **0 pkt** - odpowiedź błędna albo brak\n\n## Typowe pułapki\n\n- **Wybór typu wykresu** - treść WYRAŹNIE wymaga liniowego, nie kolumnowego/słupkowego.\n- **Skalowanie osi Y** - co 5000 kg jest wymaganiem; mile widziane od 0 do max+5000.\n- **Opis osi/wykresu** - bez tytułu i etykiet to tylko 1 pkt zamiast 2-3.\n- **Konwersja roku z daty** - w arkuszu uważać, czy data jest tekstem czy datą; `LEWY(A; 4)` zadziała tylko na tekście, dla daty użyj `ROK(A2)`.\n\n## Złożoność obliczeniowa\n\n- Agregacja: **O(n)** gdzie n = 2162 transakcji.\n- Sortowanie 10 lat: O(10 log 10) = stała.\n- Renderowanie wykresu: O(k) gdzie k = 10 punktów.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.4","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.4","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nNa potrzeby zadania 4.4 załóżmy, że firma Słodzik wprowadziła system premiowania klientów hurtowych, który obejmuje lata 2005-2014. Klient otrzymuje przy zakupie rabat, którego wysokość zależy od łącznej ilości cukru zakupionego do tej pory przez tego klienta, **wliczając w to ilość cukru z bieżącej transakcji sprzedaży**. Wysokość rabatu za każdy kilogram cukru w bieżącej transakcji wynosi:\n- 5 gr, jeśli dotychczas zakupił co najmniej 100 kg, ale mniej niż 1000 kg;\n- 10 gr, jeśli dotychczas zakupił co najmniej 1000 kg, ale mniej niż 10000 kg;\n- 20 gr, jeśli dotychczas zakupił co najmniej 10000 kg.\n\nPodaj łączną wartość rabatów udzielonych przez firmę Słodzik.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Łączna wartość rabatów: 38 126,35 zł**\n\n## Sposób 1 - kluczowa interpretacja\n\n**Treść mówi:** rabat zależy od łącznej ilości cukru **wliczając bieżącą transakcję**. Czyli liczymy nowy stan łącznego zakupu klienta PO dodaniu kg z bieżącej transakcji, i według tego stanu (>= 100, >= 1000, >= 10000 kg) określamy rabat za każdy kg w bieżącej transakcji.\n\nProgi rabatów per kg w bieżącej transakcji:\n- nowa suma < 100 kg → 0 gr/kg (brak rabatu)\n- 100 ≤ nowa suma < 1000 → **5 gr/kg = 0,05 zł/kg**\n- 1000 ≤ nowa suma < 10 000 → **10 gr/kg = 0,10 zł/kg**\n- 10 000 ≤ nowa suma → **20 gr/kg = 0,20 zł/kg**\n\n## Sposób 2 - Python\n\n```python\nfrom collections import defaultdict\n\nsumy = defaultdict(int) # NIP → dotychczasowa łączna ilość\nlaczny_rabat = 0.0\n\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg_s = linia.strip().split('\\t')\nkg = int(kg_s)\nsumy[nip] += kg # nowa suma WLICZAJĄC bieżącą transakcję\nnowa = sumy[nip]\nif nowa >= 10000:\nrabat_per_kg = 0.20\nelif nowa >= 1000:\nrabat_per_kg = 0.10\nelif nowa >= 100:\nrabat_per_kg = 0.05\nelse:\nrabat_per_kg = 0.0\nlaczny_rabat += kg * rabat_per_kg\n\nprint(f\"Łączny rabat: {laczny_rabat:.2f} zł\")\n# Łączny rabat: 38126.35 zł\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. Kolumny: A=Data, B=NIP, C=Kg.\n2. **Suma narastająca per klient** w kolumnie D:\n- D2: `=SUMA.JEŻELI($B$2:B2; B2; $C$2:C2)` - suma kg dla danego NIP od początku do bieżącego wiersza (włącznie).\n3. **Rabat per kg** w kolumnie E:\n- `=JEŻELI(D2>=10000; 0,20; JEŻELI(D2>=1000; 0,10; JEŻELI(D2>=100; 0,05; 0)))`\n4. **Rabat dla transakcji** w F: `=C2*E2`.\n5. **Suma F** = **38126,35**.\n\n## Sposób 4 - Pascal\n\n```pascal\nprogram Slodzik44;\nuses sysutils;\nvar\nf: TextFile;\nline, data, nip: string;\nkg, nowa, i, foundIdx: LongInt;\nrabatPerKg, laczny: Real;\nnipy: array[1 3000] of string;\nsumy: array[1 3000] of LongInt;\nn: Integer;\nbegin\nn := 0;\nlaczny := 0;\nAssignFile(f, 'cukier.txt');\nReset(f);\nwhile not Eof(f) do\nbegin\nReadLn(f, line);\n// [parsowanie split tabulacją: data, nip, kg]\n// Szukaj nip w tablicy nipy\nfoundIdx := 0;\nfor i := 1 to n do\nif nipy[i] = nip then foundIdx := i;\nif foundIdx = 0 then\nbegin\nn := n + 1;\nnipy[n] := nip;\nsumy[n] := 0;\nfoundIdx := n;\nend;\nsumy[foundIdx] := sumy[foundIdx] + kg;\nnowa := sumy[foundIdx];\nif nowa >= 10000 then rabatPerKg := 0.20\nelse if nowa >= 1000 then rabatPerKg := 0.10\nelse if nowa >= 100 then rabatPerKg := 0.05\nelse rabatPerKg := 0.0;\nlaczny := laczny + kg * rabatPerKg;\nend;\nCloseFile(f);\nWriteLn('Łączny rabat: ', laczny:0:2); // 38126.35\nend.\n\n## Reference algorytmiczny - narastający stan klienta\n\n> Reference - running sum per klient:\n> - Słownik nip → bieżąca suma kg.\n> - Każda transakcja UPDATE: suma[nip] += kg.\n> - Decyzja o rabacie na podstawie BIEŻĄCEJ sumy (po dodaniu kg).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.4, max 3 pkt):\n> - **3 pkt** - poprawna odpowiedź **38 126,35 zł**\n> - **2 pkt** - **38 116,80 zł** (rabaty dla wartości **większych niż** 100/1000/10000, zamiast >=)\n> - **2 pkt** - **37 175,75 zł** (rabat NIE uwzględnia kg z bieżącej transakcji)\n> - **1 pkt** - **176,30 zł** (rabat nie pomnożony przez liczbę kg)\n> - **0 pkt** - inna błędna lub brak\n\n## Typowe pułapki\n\n- **„Większe od 100\" vs „co najmniej 100\"** - treść wyraźnie mówi „co najmniej\" (>=), nie „więcej niż\" (>). Granica 100 powinna już aktywować rabat 5 gr.\n- **Pominięcie bieżącej transakcji w sumie** - uczeń liczy rabat na podstawie sumy SPRZED dodania bieżącej transakcji. Treść mówi „wliczając\", więc dodaj kg najpierw.\n- **Pominięcie pomnożenia rabatu przez kg** - łatwo zapomnieć, że rabat to **per kg w bieżącej transakcji**, nie ryczałt.\n- **Kolejność progów w if** - trzeba sprawdzać od największego (>=10000) do najmniejszego, inaczej zła klasyfikacja.\n\n## Złożoność obliczeniowa\n\n- Pojedyncze przejście transakcji + lookup w słowniku: **O(n)** gdzie n = 2162.\n- Pamięć: O(k) gdzie k = liczba unikalnych NIPów.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/4.5","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"4.5","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nFirma Słodzik chce, aby w magazynie na początku każdego miesiąca znajdowało się nie mniej niż 5000 kg cukru. Po podsumowaniu miesięcznej sprzedaży uzupełnia stan magazynu: zakupuje towar u producenta. Producent sprzedaje cukier w paletach po 1000 kg. Nie można zakupić niepełnej palety. Firma Słodzik kupuje tylko tyle palet, żeby uzupełnić stan do co najmniej 5000 kg. Zakup towaru u producenta odbywa się ostatniego dnia miesiąca przed północą.\n\nW dniu 2005-01-01, przed rozpoczęciem sprzedaży, w magazynie znajdowało się 5000 kg cukru.\n\nUwaga: bywają dni, gdy nie jest zawierana żadna transakcja sprzedaży, bywają też dni, gdy transakcji jest więcej niż jedna.\n\nPodaj, ile razy na koniec miesiąca (już po ostatniej sprzedaży w tym miesiącu) firma Słodzik w latach 2005-2014 dokupywała co najmniej 4000 kg cukru.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**14 razy**\n\n## Sposób 1 - symulacja stanu magazynu (Python)\n\n```python\nfrom collections import defaultdict\nimport math\n\n# Agreguj sprzedaż miesięczną\nsprzedaz_msc = defaultdict(int)\nwith open('cukier.txt', encoding='utf-8') as f:\nfor linia in f:\ndata, nip, kg = linia.strip().split('\\t')\nklucz = data[:7] # 'rrrr-mm'\nsprzedaz_msc[klucz] += int(kg)\n\nstan = 5000 # początkowy stan na 2005-01-01\nliczba_duzych_zakupow = 0\nzakupy = []\n\nfor msc in sorted(sprzedaz_msc.keys()):\nsprzedano = sprzedaz_msc[msc]\nstan -= sprzedano # stan po ostatniej sprzedaży miesiąca\n# Zakup pełnych palet, aby uzupełnić do >= 5000\nif stan < 5000:\nbrakuje = 5000 - stan\npalet = math.ceil(brakuje / 1000) # tyle palet, żeby było >=5000\nzakup_kg = palet * 1000\nif zakup_kg >= 4000:\nliczba_duzych_zakupow += 1\nstan += zakup_kg\n\nprint(\"Liczba zakupów >= 4000 kg:\", liczba_duzych_zakupow)\n# Liczba zakupów >= 4000 kg: 14\n\n## Sposób 2 - analiza logiki\n\n**Stan na początku miesiąca:** S₀ ≥ 5000 (po zakupie na koniec poprzedniego miesiąca).\n**Sprzedaż w miesiącu:** S_sprzedaz.\n**Stan po ostatniej sprzedaży:** S₁ = S₀ - S_sprzedaz.\n\n**Jeśli S₁ ≥ 5000:** firma NIE dokupuje (nie potrzebuje).\n**Jeśli S₁ < 5000:** brakuje = 5000 - S₁ kg. Kupuje palety: ⌈brakuje/1000⌉ * 1000 kg.\n\nLiczba palet ≥ 4: brakuje > 3000, więc S₁ < 2000. Czyli sprzedaż w miesiącu > S₀ - 2000.\n\n**Specjalny przypadek - sierpień 2010**: jeśli stan po sprzedaży miesiąca wciąż ≥ 5000 (sprzedaż mała), firma NIE kupuje wcale w tym miesiącu - stan po zakupie ≠ 5000+ (zostaje ten sam stan, więc nie wpada do liczników). To źródło typowej pomyłki dającej 15 zamiast 14.\n\n## Sposób 3 - Pascal (zarys)\n\n```pascal\nprogram Slodzik45;\nvar\nf: TextFile;\nline, data, nip, mscPrev: string;\nkg, stan, sprzedanoMsc, liczbaZakupow, brakuje, palet, zakupKg: LongInt;\nmsc: string;\nbegin\nstan := 5000;\nliczbaZakupow := 0;\nmscPrev := '';\nsprzedanoMsc := 0;\nAssignFile(f, 'cukier.txt');\nReset(f);\nwhile not Eof(f) do\nbegin\nReadLn(f, line);\nmsc := Copy(line, 1, 7); // 'rrrr-mm'\n// parsuj kg\nif (mscPrev <> '') and (msc <> mscPrev) then\nbegin\n// zamknij poprzedni miesiąc\nstan := stan - sprzedanoMsc;\nif stan < 5000 then\nbegin\nbrakuje := 5000 - stan;\npalet := (brakuje + 999) div 1000;\nzakupKg := palet * 1000;\nif zakupKg >= 4000 then liczbaZakupow := liczbaZakupow + 1;\nstan := stan + zakupKg;\nend;\nsprzedanoMsc := 0;\nend;\nsprzedanoMsc := sprzedanoMsc + kg;\nmscPrev := msc;\nend;\nCloseFile(f);\n// zamknij ostatni miesiąc\nstan := stan - sprzedanoMsc;\nif stan < 5000 then\nbegin\nbrakuje := 5000 - stan;\npalet := (brakuje + 999) div 1000;\nzakupKg := palet * 1000;\nif zakupKg >= 4000 then liczbaZakupow := liczbaZakupow + 1;\nend;\nWriteLn(liczbaZakupow); // 14\nend.\n\n## Reference algorytmiczny - symulacja stanu z zaokrąglaniem\n\n> Reference - Zaokrąglanie w górę do pełnych jednostek:\n> - `ceil(a / b)` w Pythonie z math.ceil lub `(a + b - 1) // b` całkowicie.\n> - W Pascal: `(a + b - 1) div b`.\n> - W arkuszu: `ZAOKR.GÓRA(a/b; 1)`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.5, max 4 pkt):\n> - **4 pkt** - odpowiedź **14**\n> - **3 pkt** - **13** (liczenie zakupu pierwszego dnia miesiąca zamiast ostatniego)\n> - **2 pkt** - **4** (warunek >4000 zamiast >=4000)\n> - **2 pkt** - **5** (nie uwzględniono zakupu pełnych palet - brakuje >=4000 kg)\n> - **2 pkt** - **15** (nieuwzględnienie miesiąca sierpień 2010, gdzie sprzedaż nie zmniejszyła stanu < 5000)\n> - **0 pkt** - inna błędna lub brak. **Uwaga: nie przyznaje się 1 pkt.**\n\n## Typowe pułapki\n\n- **Sierpień 2010 (kluczowa pułapka, wynik 15)** - sprzedaż w sierpniu 2010 jest na tyle mała, że stan magazynu po ostatniej sprzedaży miesiąca jest wciąż ≥ 5000. Firma NIE dokupuje wtedy nic, ale niektórzy uczniowie liczą pusty zakup jako 0 i potem nie sprawdzają warunku, dodając „fantomowe\" zakupy.\n- **>=4000 vs >4000** - treść wyraźnie „co najmniej 4000\", czyli >=4000. Zakup dokładnie 4000 kg liczy się.\n- **Zaokrąglanie palet w górę** - nie można kupić ułamka palety; brakuje 3001 kg → 4 palety = 4000 kg.\n- **Pierwszy stan magazynu** - 2005-01-01 początkowo 5000 kg, a sprzedaż styczniowa redukuje stan.\n\n## Złożoność obliczeniowa\n\n- Agregacja transakcji per miesiąc: **O(n)** gdzie n = 2162.\n- Pętla po miesiącach (120 miesięcy 2005-2014): **O(120)** = stała.\n- Łączna złożoność: **O(n)**.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/5.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"5.1","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 5. Fanka\n\nGosia mieszka w Kucykowie i jest fanką lokalnej kobiecej drużyny piłki nożnej Galop Kucykowo. Gosia zbiera informacje o wszystkich wynikach oficjalnych meczów tej drużyny. Informacje te zapisuje w plikach: druzyny.txt, sedziowie.txt, wyniki.txt.\nPierwszy wiersz w każdym z plików jest wierszem nagłówkowym. Dane w każdym wierszu oddzielone są znakiem tabulacji.\n\n**druzyny.txt** - Id_druzyny (1-100), Nazwa (max 30 zn.), Miasto (max 30 zn.).\nPrzykład:\n1 | Srebrne Pumy | Olsztyn\n13 | Szybkie Mewy | Bydgoszcz\n\n**sedziowie.txt** - Nr_licencji (6 zn.), Imie (max 20), Nazwisko (max 50).\nPrzykład:\nKJ9494 | Anna | Adamczyk\nKI2449 | Weronika | Mazur\n\n**wyniki.txt** - Data_meczu (rrrr-mm-dd), Rodzaj_meczu (T/L/P), Gdzie (W/D), Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone.\nPrzykład:\n2002-01-01 | L | W | 5 | DM2649 | 3 | 0\n2002-01-03 | L | D | 60 | KJ9494 | 0 | 1\n\na) Podaj, ile towarzyskich, ile ligowych oraz ile pucharowych meczów rozegrała drużyna Galop Kucykowo z drużynami ze swego miasta.\n\nb) W którym roku drużyna Galop Kucykowo rozegrała najwięcej meczów z drużynami ze swego miasta (łącznie wszystkie rodzaje meczów)? Podaj rok i liczbę tych meczów.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**a) Liczba meczów z drużynami z Kucykowa:**\n- Towarzyskie (T): **6**\n- Ligowe (L): **113**\n- Pucharowe (P): **25**\n\n**b) Najwięcej meczów: rok 2007, liczba meczów: 21**\n\n## Sposób 1 - SQL (cała baza w jednym schemacie)\n\nZakładamy zaimportowane tabele: `druzyny(Id_druzyny, Nazwa, Miasto)`, `wyniki(Data_meczu, Rodzaj_meczu, Gdzie, Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone)`.\n\nKrok 1 - znajdź Id Galop Kucykowo:\n```sql\nSELECT Id_druzyny FROM druzyny WHERE Nazwa = 'Galop Kucykowo';\n-- np. zwraca 50\n\nKażdy wiersz w `wyniki` to mecz Galop Kucykowo (treść mówi: zbiera wyniki TYLKO swojej drużyny) - `Id_druzyny` w tabeli wyniki to przeciwnik.\n\n### a) Liczba meczów per rodzaj:\n```sql\nSELECT w.Rodzaj_meczu, COUNT(*) AS liczba\nFROM wyniki w\nJOIN druzyny d ON w.Id_druzyny = d.Id_druzyny\nWHERE d.Miasto = 'Kucykowo'\nGROUP BY w.Rodzaj_meczu;\n\nWynik:\nT | 6\nL | 113\nP | 25\n\n### b) Rok z największą liczbą meczów z Kucykowa:\n```sql\nSELECT EXTRACT(YEAR FROM w.Data_meczu) AS rok, COUNT(*) AS liczba\nFROM wyniki w\nJOIN druzyny d ON w.Id_druzyny = d.Id_druzyny\nWHERE d.Miasto = 'Kucykowo'\nGROUP BY rok\nORDER BY liczba DESC\nLIMIT 1;\n\nWynik:\n2007 | 21\n\n(W SQLite: `strftime('%Y', Data_meczu)`. W Access: `YEAR(Data_meczu)`.)\n\n## Sposób 2 - Python\n\n```python\nfrom collections import defaultdict\n\n# Wczytaj drużyny: Id → Miasto\ndruzyny_miasto = {}\nwith open('druzyny.txt', encoding='utf-8') as f:\nnext(f) # skip header\nfor line in f:\nidd, nazwa, miasto = line.strip().split('\\t')\ndruzyny_miasto[int(idd)] = miasto\n\nlicznik_rodzaj = defaultdict(int)\nlicznik_rok = defaultdict(int)\nwith open('wyniki.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nparts = line.strip().split('\\t')\ndata, rodzaj, gdzie, idd, lic, bz, bs = parts\nif druzyny_miasto[int(idd)] == 'Kucykowo':\nlicznik_rodzaj[rodzaj] += 1\nlicznik_rok[data[:4]] += 1\n\nprint(\"T:\", licznik_rodzaj['T']) # 6\nprint(\"L:\", licznik_rodzaj['L']) # 113\nprint(\"P:\", licznik_rodzaj['P']) # 25\n\nbest_rok, best_count = max(licznik_rok.items(), key=lambda x: x[1])\nprint(\"Rok:\", best_rok, \"liczba:\", best_count) # 2007 21\n\n## Reference algorytmiczny - JOIN + agregacja\n\n> Reference - agregacja po JOIN:\n> - `INNER JOIN` łączy wyniki z druzyny po Id_druzyny.\n> - `WHERE Miasto = 'Kucykowo'` filtruje przeciwników z tego samego miasta.\n> - `GROUP BY Rodzaj_meczu` agreguje per rodzaj.\n> - `GROUP BY EXTRACT(YEAR FROM data)` agreguje per rok.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.1, max 3 pkt):\n> - **1 pkt** - 5.1.a: poprawne liczby T=6, L=113, P=25\n> - **2 pkt** - 5.1.b:\n> - 1 pkt za prawidłowy rok (2007)\n> - 1 pkt za prawidłową liczbę meczów (21)\n> - **0 pkt** - błędna lub brak\n\n## Typowe pułapki\n\n- **Filtrowanie po nazwie miasta** - drużyna Galop Kucykowo grała z innymi drużynami z Kucykowa. NIE filtruj po `Nazwa = 'Galop Kucykowo'` - to filtruje samą siebie!\n- **Wyniki zawierają TYLKO mecze Galop Kucykowo** - według treści Gosia zbiera dane o swojej drużynie, więc każdy wiersz w `wyniki.txt` to mecz Galop. Kolumna `Id_druzyny` w wynikach to PRZECIWNIK.\n- **Rok z daty** - wystarczy `LEFT(data, 4)` lub `EXTRACT(YEAR FROM data)`; uważać na format daty (rrrr-mm-dd).\n- **3 wiersze w wyniku rodzajów** - wszystkie 3 typy (T, L, P) muszą być w odpowiedzi.\n\n## Złożoność obliczeniowa\n\n- SQL: O(n log n) dla GROUP BY + JOIN z indeksami.\n- Python: O(n) gdzie n = liczba wierszy w wyniki.txt.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/5.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"5.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPodaj listę zawierającą nazwy drużyn, z którymi drużyna Galop Kucykowo ma zerowy bilans bramkowy, tzn. łączna liczba bramek zdobytych we wszystkich meczach rozegranych z daną drużyną jest równa łącznej liczbie bramek straconych w tych meczach.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Drużyny z zerowym bilansem bramkowym z Galop Kucykowo:**\n- **Zwinne Mewy** (Id_druzyny = 84)\n- **Nocne Pumy** (Id_druzyny = 48)\n\n## Sposób 1 - SQL\n\n```sql\nSELECT d.Nazwa,\nSUM(w.Bramki_zdobyte) AS Z,\nSUM(w.Bramki_stracone) AS S\nFROM wyniki w\nJOIN druzyny d ON w.Id_druzyny = d.Id_druzyny\nGROUP BY d.Id_druzyny, d.Nazwa\nHAVING SUM(w.Bramki_zdobyte) = SUM(w.Bramki_stracone);\n\nWynik:\nZwinne Mewy | X | X\nNocne Pumy | Y | Y\n\n## Sposób 2 - Python\n\n```python\nfrom collections import defaultdict\n\n# Wczytaj drużyny\ndruzyny = {} # Id → Nazwa\nwith open('druzyny.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nidd, nazwa, miasto = line.strip().split('\\t')\ndruzyny[int(idd)] = nazwa\n\n# Agreguj zdobyte/stracone per Id\nzdobyte = defaultdict(int)\nstracone = defaultdict(int)\nwith open('wyniki.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nparts = line.strip().split('\\t')\nidd = int(parts[3])\nzdobyte[idd] += int(parts[5])\nstracone[idd] += int(parts[6])\n\nfor idd in zdobyte:\nif zdobyte[idd] == stracone[idd]:\nprint(druzyny[idd])\n# Output:\n# Zwinne Mewy\n# Nocne Pumy\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. Zaimportuj wyniki.txt do kolumn A-G.\n2. Tabela przestawna: Wiersze = Id_druzyny, Wartości = SUMA Bramki_zdobyte, SUMA Bramki_stracone.\n3. Dodaj kolumnę różnicy: Zdobyte - Stracone.\n4. Filtruj wiersze z różnicą = 0.\n5. WYSZUKAJ.PIONOWO po Id_druzyny → Nazwa.\n\n## Reference algorytmiczny - agregacja z warunkiem na wynikach\n\n> Reference - HAVING z agregatami:\n> - `HAVING SUM(a) = SUM(b)` filtruje grupy po WARTOŚCIACH agregatów.\n> - Różnica vs WHERE: WHERE działa na pojedynczych wierszach, HAVING na grupach.\n> - Klauzula HAVING wymaga GROUP BY (lub SELECT z agregatem bez kolumn).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.2, max 2 pkt):\n> - **2 pkt** - za podanie dwóch poprawnych nazw drużyn (Zwinne Mewy, Nocne Pumy)\n> - **1 pkt** - za podanie poprawnych dwóch Id_druzyny (84 i 48), ale bez nazw\n> - **0 pkt** - błędna odpowiedź lub brak\n\n## Typowe pułapki\n\n- **Pominięcie nazwy** - treść wymaga NAZW drużyn, nie Id. Potrzebny JOIN z `druzyny`.\n- **Niewłaściwe agregowanie** - trzeba SUMOWAĆ po WSZYSTKICH meczach z daną drużyną, nie tylko pojedynczy mecz (jednomeczowy bilans).\n- **GROUP BY tylko po Id, nie po Nazwa** - w wielu SQL silnikach trzeba w GROUP BY mieć też kolumny SELECT, ale praktycznie Nazwa jest funkcyjnie zależna od Id, więc OK po GROUP BY Id.\n- **„Zerowy bilans\" interpretacja** - to NIE znaczy „zerowe bramki\", ale RÓŻNICA = 0 (zdobyte = stracone).\n\n## Złożoność obliczeniowa\n\n- SQL z GROUP BY: O(n log n) z indeksami.\n- Python: O(n) z słownikiem agregatów.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/5.3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"5.3","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPodaj liczby meczów wyjazdowych - wygranych, przegranych i zremisowanych - przez drużynę Galop Kucykowo.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Mecze wyjazdowe Galop Kucykowo:**\n- Wygrane: **579**\n- Przegrane: **452**\n- Zremisowane: **170**\n\n## Sposób 1 - interpretacja danych\n\n**Kolumna `Gdzie`** w `wyniki.txt`:\n- **W** = swoim boisku (u siebie, Galop Kucykowo gra W swoim Kucykowie)\n- **D** = na boisku przeciwnika (wyjazdowy)\n\n**UWAGA - KLUCZOWA INTERPRETACJA:** Treść mówi o meczach **WYJAZDOWYCH**, czyli `Gdzie = 'D'` (na wyjeździe).\n\n**Definicja wyniku:**\n- Wygrana: Bramki_zdobyte > Bramki_stracone\n- Przegrana: Bramki_zdobyte < Bramki_stracone\n- Remis: Bramki_zdobyte = Bramki_stracone\n\n## Sposób 2 - SQL\n\n```sql\nSELECT\nSUM(CASE WHEN Bramki_zdobyte > Bramki_stracone THEN 1 ELSE 0 END) AS Wygrane,\nSUM(CASE WHEN Bramki_zdobyte < Bramki_stracone THEN 1 ELSE 0 END) AS Przegrane,\nSUM(CASE WHEN Bramki_zdobyte = Bramki_stracone THEN 1 ELSE 0 END) AS Remisy\nFROM wyniki\nWHERE Gdzie = 'D';\n\nWynik: 579 | 452 | 170\n\nLub jako 3 oddzielne zapytania:\n```sql\nSELECT COUNT(*) FROM wyniki WHERE Gdzie = 'D' AND Bramki_zdobyte > Bramki_stracone; -- 579\nSELECT COUNT(*) FROM wyniki WHERE Gdzie = 'D' AND Bramki_zdobyte < Bramki_stracone; -- 452\nSELECT COUNT(*) FROM wyniki WHERE Gdzie = 'D' AND Bramki_zdobyte = Bramki_stracone; -- 170\n\n## Sposób 3 - Python\n\n```python\nwygrane = przegrane = remisy = 0\nwith open('wyniki.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nparts = line.strip().split('\\t')\ngdzie = parts[2]\nbz = int(parts[5])\nbs = int(parts[6])\nif gdzie == 'D':\nif bz > bs:\nwygrane += 1\nelif bz < bs:\nprzegrane += 1\nelse:\nremisy += 1\n\nprint(\"Wygrane:\", wygrane) # 579\nprint(\"Przegrane:\", przegrane) # 452\nprint(\"Remisy:\", remisy) # 170\n\n## Sposób 4 - arkusz kalkulacyjny\n\n1. W kolumnie H: `=JEŻELI(F2>G2; \"W\"; JEŻELI(F2<G2; \"P\"; \"R\"))` - kategoryzacja wyniku.\n2. **LICZ.WARUNKI** dla wyjazdowych:\n- Wygrane: `=LICZ.WARUNKI(C:C; \"D\"; H:H; \"W\")` → 579\n- Przegrane: `=LICZ.WARUNKI(C:C; \"D\"; H:H; \"P\")` → 452\n- Remisy: `=LICZ.WARUNKI(C:C; \"D\"; H:H; \"R\")` → 170\n\n## Reference algorytmiczny - CASE WHEN i agregaty\n\n> Reference - kategoryzacja w SQL:\n> - `CASE WHEN warunek THEN wartość ELSE inna_wartość END` - odpowiednik if-else.\n> - `SUM(CASE WHEN THEN 1 ELSE 0 END)` = liczba wierszy spełniających warunek (alternatywa do COUNT z WHERE).\n> - Filtr w SQL może też być wieloma zapytaniami z COUNT + różne WHERE.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.3, max 3 pkt):\n> - **3 pkt** - wszystkie 3 liczby poprawne (po 1 pkt za wiersz)\n> - **2 pkt** - odpowiedź BEZ filtru wyjazdowych (910, 352, 1185)\n> - **0 pkt** - inna błędna lub brak\n\n## Typowe pułapki\n\n- **Brak filtru `Gdzie = 'D'`** - najczęstszy błąd. Liczba meczów wyjazdowych ≠ wszystkich meczów.\n- **Pomylenie W/D** - D może być interpretowane różnie. Tu **D = wyjazdowy** (na boisku przeciwnika). Sprawdzenie: zwykle drużyna ma zbliżoną liczbę meczów u siebie i na wyjeździe. Można też zweryfikować po przykładzie z treści zadania 5.1.\n- **Zwracanie tylko jednego wiersza zamiast 3** - wyjście musi mieć 3 osobne liczby (wygrane/przegrane/remisy).\n- **Pomylenie remisu z brakiem bramek** - remis to bramki_zdobyte = bramki_stracone (mogą być 3-3, 0-0, itd.).\n\n## Złożoność obliczeniowa\n\n- SQL: O(n) z filtrem WHERE i agregatem.\n- Python: O(n) z pojedynczym przejściem pliku.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/5.4","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"5.4","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPodaj, ilu sędziów spośród tych zapisanych w pliku sedziowie.txt nie sędziowało żadnego pucharowego meczu drużyny Galop Kucykowo.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Liczba sędziów, którzy NIE sędziowali żadnego pucharowego meczu Galop Kucykowo: 22**\n\nW skład 22 wchodzą:\n- **18** sędziów, którzy sędziowali jakieś mecze Galop Kucykowo, ale NIE pucharowe (np. ligowe lub towarzyskie).\n- **4** sędziów z pliku sedziowie.txt, którzy w ogóle nie sędziowali żadnego meczu Galop Kucykowo.\n\n## Sposób 1 - SQL (NOT IN / EXCEPT)\n\nNajkrótsze podejście: znajdź sędziów, którzy sędziowali jakiś pucharowy mecz, a następnie zlicz tych, którzy NIE są na tej liście.\n\n```sql\nSELECT COUNT(*) AS liczba\nFROM sedziowie\nWHERE Nr_licencji NOT IN (\nSELECT DISTINCT Nr_licencji\nFROM wyniki\nWHERE Rodzaj_meczu = 'P'\n);\n\n**Wynik:** `22`\n\nUwaga - całość `wyniki.txt` to mecze Galop Kucykowo (treść zadania 5.1: Gosia zapisuje TYLKO wyniki swojej drużyny), więc filtr `Rodzaj_meczu = 'P'` automatycznie ogranicza się do meczów Galop Kucykowo.\n\nAlternatywnie z LEFT JOIN:\n```sql\nSELECT COUNT(*) AS liczba\nFROM sedziowie s\nLEFT JOIN (\nSELECT DISTINCT Nr_licencji FROM wyniki WHERE Rodzaj_meczu = 'P'\n) p ON s.Nr_licencji = p.Nr_licencji\nWHERE p.Nr_licencji IS NULL;\n\n## Sposób 2 - Python (zbiory)\n\n```python\n# Wczytaj wszystkich sedziow\nsedziowie_all = set()\nwith open('sedziowie.txt', encoding='utf-8') as f:\nnext(f) # header\nfor line in f:\nnr_lic, imie, nazwisko = line.strip().split('\\t')\nsedziowie_all.add(nr_lic)\n\n# Znajdz sedziow ktorzy sedziowali jakis mecz pucharowy\nsedziowie_puchar = set()\nwith open('wyniki.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nparts = line.strip().split('\\t')\nrodzaj = parts[1]\nnr_lic = parts[4]\nif rodzaj == 'P':\nsedziowie_puchar.add(nr_lic)\n\n# Roznica zbiorow: sedziowie BEZ pucharowego meczu Galop\nbez_pucharu = sedziowie_all - sedziowie_puchar\nprint(len(bez_pucharu)) # 22\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Krok 1:** Wczytaj sedziowie.txt do tabeli A (kolumna A = Nr_licencji).\n\n**Krok 2:** Wczytaj wyniki.txt, filtruj po `Rodzaj_meczu = 'P'`, wyciągnij UNIKATOWE wartości Nr_licencji.\n\n**Krok 3:** W kolumnie B obok każdego sędziego: `=LICZ.JEŻELI(zakres_pucharowych; A2)` - zwraca 0 jeśli sędzia nie sędziował pucharowego.\n\n**Krok 4:** `=LICZ.JEŻELI(B:B; 0)` = 22.\n\n## Reference algorytmiczny - różnica zbiorów\n\n> Reference - operacja \"NOT IN\" / różnica zbiorów:\n> - **SQL**: `WHERE x NOT IN (SELECT )` lub `LEFT JOIN WHERE IS NULL` (anty-join).\n> - **Python**: `set_A - set_B` zwraca elementy w A, których nie ma w B.\n> - **Złożoność**: O(N) przy użyciu set/hash dla obu zbiorów.\n> - Alternatywa: `EXCEPT` w SQL (`SELECT Nr FROM sedziowie EXCEPT SELECT Nr FROM wyniki WHERE Rodzaj = 'P'`).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.4, max 3 pkt):\n> - **3 pkt** - prawidłowa odpowiedź: **22** (wszyscy sędziowie z pliku którzy nie sędziowali żadnego pucharu Galop).\n> - **2 pkt** - odpowiedź **18** (uwzględniono tylko sędziów, którzy sędziowali jakikolwiek inny mecz Galop Kucykowo, ale nie pucharowy - pominięto 4 sędziów, którzy nie sędziowali w ogóle).\n> - **2 pkt** - odpowiedź **4** (uwzględniono tylko sędziów, którzy nie sędziowali żadnego meczu Galop).\n> - **0 pkt** - inna błędna odpowiedź lub brak.\n> - **UWAGA:** Nie przyznaje się 1 pkt.\n\n## Typowe pułapki\n\n- **Pominięcie sędziów którzy w ogóle nie sędziowali** - typowy błąd punktowany 2 pkt zamiast 3. Treść mówi \"spośród tych zapisanych w sedziowie.txt\", więc wszyscy sędziowie z tego pliku są w grupie startowej.\n- **Wymagana DISTINCT** - w wyniki.txt jeden sędzia może sędziować wiele meczów pucharowych. Bez DISTINCT podzapytanie zwróciłoby duplikaty (ale NOT IN i tak by działał poprawnie).\n- **Pomylenie kierunku** - pytanie o sędziów BEZ pucharu, nie sędziujących pucharowy mecz.\n- **Filtr `Rodzaj_meczu = 'P'`** - tylko pucharowe. Mecze T (towarzyskie) i L (ligowe) nie liczą się.\n- **Cała baza wyniki.txt to mecze Galop Kucykowo** - nie trzeba filtrować po Id_druzyny = Galop (bo Gosia zapisuje tylko swoją drużynę).\n\n## Złożoność obliczeniowa\n\n- SQL z NOT IN + DISTINCT: O(N + M) z hash, O(N · M) bez indeksów.\n- Python z set: O(N + M).\n- Anty-join (LEFT JOIN IS NULL): zwykle szybszy niż NOT IN dla dużych zbiorów.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/6.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"6.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 6. Piksele\n\nW pliku dane.txt znajduje się 200 wierszy. Każdy wiersz zawiera 320 liczb naturalnych z przedziału od 0 do 255, oddzielonych znakami pojedynczego odstępu (spacjami). Przedstawiają one jasności kolejnych pikseli czarno-białego obrazu o wymiarach 320 na 200 pikseli (od 0 - czarny do 255 - biały).\n\nNapisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wyniki6.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.\n\nUwaga: plik przyklad.txt zawiera dane przykładowe spełniające warunki zadania (obraz ma takie same rozmiary). Odpowiedzi dla danych z pliku przyklad.txt są podane pod poleceniami.\n\nPodaj jasność najjaśniejszego i jasność najciemniejszego piksela.\n\nDla danych z pliku przyklad.txt wynikiem jest 255 (najjaśniejszy) i 0 (najciemniejszy).","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Dla `dane.txt`:**\n- Najjaśniejszy piksel: **221**\n- Najciemniejszy piksel: **7**\n\n**Dla `przyklad.txt`:**\n- Najjaśniejszy: 255\n- Najciemniejszy: 0\n\n## Sposób 1 - Python (najprostszy)\n\nWczytujemy plik, zbieramy wszystkie 320×200 = 64 000 wartości i obliczamy min/max.\n\n```python\nwith open('dane.txt') as f:\nwszystkie = []\nfor linia in f:\nwszystkie.extend(int(x) for x in linia.split())\n\nprint('Najjasniejszy:', max(wszystkie)) # 221\nprint('Najciemniejszy:', min(wszystkie)) # 7\n\nLub jednolinijkowo z generator expression (oszczędniejsze pamięciowo):\n```python\nwith open('dane.txt') as f:\npikse = [int(x) for linia in f for x in linia.split()]\nprint(max(pikse), min(pikse))\n\n## Sposób 2 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <climits>\nusing namespace std;\n\nint main() {\nifstream plik(\"dane.txt\");\nint x, najw = INT_MIN, najm = INT_MAX;\nwhile (plik >> x) {\nif (x > najw) najw = x;\nif (x < najm) najm = x;\n}\ncout << \"Najjasniejszy: \" << najw << endl;\ncout << \"Najciemniejszy: \" << najm << endl;\nreturn 0;\n}\n// Najjasniejszy: 221\n// Najciemniejszy: 7\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram NajPiksel;\nvar\nf: TextFile;\nx, najw, najm: Integer;\nbegin\nAssignFile(f, 'dane.txt');\nReset(f);\nnajw := 0;\nnajm := 255;\nwhile not Eof(f) do\nbegin\nRead(f, x);\nif x > najw then najw := x;\nif x < najm then najm := x;\nend;\nCloseFile(f);\nWriteln('Najjasniejszy: ', najw);\nWriteln('Najciemniejszy: ', najm);\nend.\n\n## Reference algorytmiczny - min/max w pojedynczym przebiegu\n\n> Reference - Wyznaczenie min i max:\n> - Pojedynczy przebieg O(n), wystarczy 2n-2 porównań naiwnie, optymalnie 3n/2.\n> - Inicjalizacja: dla max → najmniejsza wartość (lub pierwszy element), dla min → największa (lub pierwszy).\n> - Python: wbudowane `max()` i `min()` - czas O(n), kod 1-linijkowy.\n> - C++: `*max_element( )` i `*min_element( )` z `<algorithm>`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.1, max 2 pkt):\n> - **2 pkt** - prawidłowa pełna odpowiedź:\n> - **1 pkt** za podanie wartości najjaśniejszego piksela (221).\n> - **1 pkt** za podanie wartości najciemniejszego piksela (7).\n> - **0 pkt** - odpowiedź błędna lub brak.\n\n## Typowe pułapki\n\n- **Wczytywanie nie obejmuje wszystkich pikseli** - uważać czy plik kończy się znakiem nowej linii po ostatniej linii (whitespace tokenizery zwykle radzą sobie z tym).\n- **Inicjalizacja max/min** - jeśli inicjalizujesz `najw = 0`, a wszystkie wartości są >= 0, to OK. Lepiej `najw = INT_MIN` (lub pierwszą wczytaną wartość).\n- **Mylenie kolumn/wierszy** - zadanie pyta o WARTOŚCI pikseli, nie ich pozycje. Nie potrzeba pamiętać współrzędnych.\n- **Format wyjścia** - \"najjasniejszy: 221, najciemniejszy: 7\" w pliku wyniki6.txt, poprzedzony numerem zadania (6.1).\n\n## Złożoność obliczeniowa\n\n- Wczytanie: O(n) gdzie n = 64 000 pikseli.\n- Min/max: O(n) w jednym przebiegu.\n- **Całkowita: O(n)**, czyli liniowa.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/6.2","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"6.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nPodaj, ile wynosi najmniejsza liczba wierszy, które należy usunąć, żeby obraz miał pionową oś symetrii. Obraz ma pionową oś symetrii, jeśli w każdym wierszu i-ty piksel od lewej strony przyjmuje tę samą wartość, co i-ty piksel od prawej strony, dla dowolnego 1 ≤ i ≤ 320.\n\nDla danych z pliku przyklad.txt wynikiem jest 3.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Najmniejsza liczba wierszy do usunięcia: 149** (z 200 wierszy w `dane.txt`).\n\nDla `przyklad.txt`: 3.\n\nInterpretacja: obraz będzie miał pionową oś symetrii, jeśli zostawimy tylko te wiersze, które SAMODZIELNIE są palindromami (czytane od lewej = od prawej). Wystarczy zliczyć wiersze NIE-palindromowe - te trzeba usunąć.\n\nPionowa oś symetrii działa NIEZALEŻNIE w każdym wierszu - wiersz jest \"symetryczny\", gdy A[k] = A[321-k] dla k = 1 160 (lub równoważnie [0 159] przy indeksowaniu od 0).\n\n## Sposób 1 - Python (najczystszy)\n\n```python\nusuwajacych = 0\nwith open('dane.txt') as f:\nfor linia in f:\nwiersz = linia.split() # 320 stringow\n# Sprawdz palindrom\nif wiersz != wiersz[::-1]:\nusuwajacych += 1\n\nprint(usuwajacych) # 149\n\nLub jedno-linijkowo:\n```python\nwith open('dane.txt') as f:\nprint(sum(1 for l in f if (w := l.split()) != w[::-1]))\n\n## Sposób 2 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <vector>\nusing namespace std;\n\nint main() {\nifstream plik(\"dane.txt\");\nint do_usuniecia = 0;\nstring linia;\nwhile (getline(plik, linia)) {\nvector<int> w;\nsize_t pos = 0, next;\n// Parsuj liczby z linii\nwhile ((next = linia.find(' ', pos)) != string::npos) {\nw.push_back(stoi(linia.substr(pos, next - pos)));\npos = next + 1;\n}\nif (pos < linia.size()) w.push_back(stoi(linia.substr(pos)));\n// Sprawdz palindrom\nbool palindrom = true;\nint n = w.size();\nfor (int i = 0; i < n / 2; i++) {\nif (w[i] != w[n - 1 - i]) { palindrom = false; break; }\n}\nif (!palindrom) do_usuniecia++;\n}\ncout << do_usuniecia << endl; // 149\nreturn 0;\n}\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram OsSymetrii;\nvar\nf: TextFile;\nwiersz: array[1 320] of Integer;\ni, j, n: Integer;\ndo_usuniecia: Integer;\npalindrom: Boolean;\nbegin\nAssignFile(f, 'dane.txt');\nReset(f);\ndo_usuniecia := 0;\nfor i := 1 to 200 do\nbegin\nfor j := 1 to 320 do Read(f, wiersz[j]);\nReadln(f);\npalindrom := True;\nfor j := 1 to 160 do\nif wiersz[j] <> wiersz[321 - j] then\nbegin\npalindrom := False;\nBreak;\nend;\nif not palindrom then Inc(do_usuniecia);\nend;\nCloseFile(f);\nWriteln(do_usuniecia); // 149\nend.\n\n## Reference algorytmiczny - sprawdzanie palindromu\n\n> Reference - palindromiczność wiersza:\n> - Wiersz jest palindromem ⇔ wiersz[i] = wiersz[n-1-i] dla każdego i ∈ [0, n/2).\n> - Złożoność: O(n/2) = O(n) na wiersz.\n> - W Pythonie najprościej: `wiersz == wiersz[::-1]` (operator slice odwracający listę).\n> - Dla 200 wierszy × 320 pikseli: łącznie 200 × 160 = 32 000 porównań. Szybko.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.2, max 2 pkt):\n> - **2 pkt** - prawidłowa odpowiedź: **149**.\n> - **0 pkt** - odpowiedź błędna lub brak.\n> - **UWAGA:** Nie przyznaje się 1 pkt.\n\n## Typowe pułapki\n\n- **Mylenie sensu pionowej osi symetrii** - to symetria LEWO-PRAWO (kolumna i = kolumna 321-i), a nie góra-dół.\n- **\"Najmniejsza liczba wierszy do usunięcia\"** - to po prostu liczba wierszy NIE-palindromowych (każdy taki MUSI być usunięty, palindromowe MOGĄ zostać).\n- **Indeksowanie 1 320 vs 0 319** - w Python od 0, w pseudokodzie CKE od 1. `wiersz[i] vs wiersz[321-i]` jeśli indeksujemy od 1, a `wiersz[i] vs wiersz[319-i]` od 0.\n- **Tylko połowa porównań wystarczy** - sprawdzaj `i` od 0 do n/2-1 (lub do n//2). Sprawdzanie wszystkich par jest podwójną pracą.\n- **Pomylenie z liczbą wierszy POZOSTAŁYCH** - pytanie o USUNIĘTE (149), nie zachowane (51 = 200 - 149).\n\n## Złożoność obliczeniowa\n\n- Wczytanie: O(n × m) = O(64 000).\n- Sprawdzenie palindromu per wiersz: O(m/2) = O(160) = O(m).\n- **Całkowita: O(n × m) = O(64 000)**, liniowa względem rozmiaru obrazu.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/6.3","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"6.3","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nSąsiednie piksele to takie, które leżą obok siebie w tym samym wierszu lub w tej samej kolumnie. Dwa sąsiednie piksele nazywamy kontrastującymi, jeśli ich wartości różnią się o więcej niż 128. Podaj liczbę wszystkich takich pikseli, dla których istnieje przynajmniej jeden kontrastujący z nim sąsiedni piksel.\n\nDla danych z pliku przyklad.txt wynikiem jest 5.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Liczba pikseli mających przynajmniej jednego kontrastującego sąsiada: 753** (z 64 000 pikseli w `dane.txt`).\n\nDla `przyklad.txt`: 5.\n\nKluczowe definicje:\n- Sąsiad piksela (r, c): (r-1, c), (r+1, c), (r, c-1), (r, c+1) - góra, dół, lewo, prawo (4-sąsiedztwo).\n- Kontrastujący: |A[r1][c1] - A[r2][c2]| > 128 (różnica BEZWZGLĘDNA, ostro większa).\n- Liczymy KAŻDY piksel raz, jeśli MA przynajmniej jednego takiego sąsiada.\n\n## Sposób 1 - Python (najczytelniejszy)\n\n```python\n# Wczytaj obraz jako liste list\nwith open('dane.txt') as f:\nobraz = [[int(x) for x in linia.split()] for linia in f]\n\nW, K = len(obraz), len(obraz[0]) # 200 wierszy, 320 kolumn\nKONTRAST = 128\nlicznik = 0\n\nfor r in range(W):\nfor c in range(K):\nv = obraz[r][c]\n# Sprawdz 4 sasiadow\nma_kontrast = False\nfor dr, dc in [(-1,0), (1,0), (0,-1), (0,1)]:\nnr, nc = r + dr, c + dc\nif 0 <= nr < W and 0 <= nc < K:\nif abs(obraz[nr][nc] - v) > 128:\nma_kontrast = True\nbreak\nif ma_kontrast:\nlicznik += 1\n\nprint(licznik) # 753\n\n## Sposób 2 - C++ (z tablicą 2D)\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <cmath>\nusing namespace std;\n\nconst int W = 200, K = 320;\nint obraz[W][K];\n\nint main() {\nifstream plik(\"dane.txt\");\nfor (int r = 0; r < W; r++)\nfor (int c = 0; c < K; c++)\nplik >> obraz[r][c];\nint dr[] = {-1, 1, 0, 0};\nint dc[] = {0, 0, -1, 1};\nint licznik = 0;\nfor (int r = 0; r < W; r++) {\nfor (int c = 0; c < K; c++) {\nfor (int k = 0; k < 4; k++) {\nint nr = r + dr[k], nc = c + dc[k];\nif (nr >= 0 && nr < W && nc >= 0 && nc < K) {\nif (abs(obraz[nr][nc] - obraz[r][c]) > 128) {\nlicznik++;\nbreak; // wystarczy jeden kontrast\n}\n}\n}\n}\n}\ncout << licznik << endl; // 753\nreturn 0;\n}\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram Kontrast;\nvar\nobraz: array[1 200, 1 320] of Integer;\nr, c, nr, nc, k: Integer;\ndr: array[1 4] of Integer = (-1, 1, 0, 0);\ndc: array[1 4] of Integer = (0, 0, -1, 1);\nlicznik: Integer;\nma_kontrast: Boolean;\nf: TextFile;\nbegin\nAssignFile(f, 'dane.txt'); Reset(f);\nfor r := 1 to 200 do\nfor c := 1 to 320 do Read(f, obraz[r, c]);\nCloseFile(f);\nlicznik := 0;\nfor r := 1 to 200 do\nfor c := 1 to 320 do\nbegin\nma_kontrast := False;\nfor k := 1 to 4 do\nbegin\nnr := r + dr[k]; nc := c + dc[k];\nif (nr >= 1) and (nr <= 200) and (nc >= 1) and (nc <= 320) then\nif Abs(obraz[nr, nc] - obraz[r, c]) > 128 then\nbegin\nma_kontrast := True;\nBreak;\nend;\nend;\nif ma_kontrast then Inc(licznik);\nend;\nWriteln(licznik); // 753\nend.\n\n## Reference algorytmiczny - 4-sąsiedztwo na siatce\n\n> Reference - typowy wzór na 4 sąsiadów:\n> - **dr/dc = [(-1,0), (1,0), (0,-1), (0,1)]** - góra, dół, lewo, prawo.\n> - Sprawdzaj granice siatki: `0 <= nr < W and 0 <= nc < K` (Python) lub `nr >= 1 <= W` (Pascal indeksuje od 1).\n> - **Wartość bezwzględna** - `abs( )` w Pythonie / `Abs( )` w Pascalu / `abs( )` w `<cmath>`.\n> - **Optymalizacja:** `break` po znalezieniu pierwszego kontrastującego sąsiada - wystarczy jeden, by piksel zaliczyć.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.3, max 3 pkt):\n> - **3 pkt** - prawidłowa odpowiedź: **753**.\n> - **2 pkt** - odpowiedź **768** (różnica wartości większa lub RÓWNA 128 - błąd \"≥\" zamiast \">\").\n> - **1 pkt** - odpowiedź **166** lub **587** (brak wartości bezwzględnej - tylko jedna strona różnicy).\n> - **1 pkt** - odpowiedź **1226** (wielokrotne zliczanie tego samego piksela, gdy ma kilku kontrastujących sąsiadów).\n> - **1 pkt** - odpowiedź **747** / **750** / **752** (nie uwzględniono pikseli brzegowych - pomyłka z indeksami).\n> - **0 pkt** - inna błędna lub brak.\n\n## Typowe pułapki\n\n- **Różnica BEZWZGLĘDNA** - `|a - b|` > 128, nie `a - b` > 128. Bez `abs()` tracimy połowę kontrastów (lub kradniemy 2 pkt z 3).\n- **STRICTNIE większa od 128** - wartość 128 NIE jest kontrastem. Często studenci piszą `>= 128` i tracą punkty (otrzymują 768 zamiast 753).\n- **Liczenie tego samego piksela WIELOKROTNIE** - jeśli piksel ma 2-3 kontrastujących sąsiadów, mimo to liczymy go RAZ. `break` po pierwszym kontraście rozwiązuje problem.\n- **Brzegowe piksele** - piksele rogowe mają tylko 2 sąsiadów, krawędziowe 3. Sprawdzenie granic siatki obowiązkowe - inaczej out-of-bounds lub błędne wyniki (747/750/752).\n- **4-sąsiedztwo vs 8-sąsiedztwo** - zadanie wyraźnie mówi \"obok siebie w tym samym wierszu LUB w tej samej kolumnie\", czyli 4-sąsiedztwo (bez diagonali).\n\n## Złożoność obliczeniowa\n\n- Wczytanie: O(n × m) = O(64 000).\n- Iteracja po wszystkich pikselach × 4 sąsiadów: O(4 · n · m) = O(256 000).\n- **Całkowita: O(n · m)**, liniowa względem rozmiaru obrazu.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"},{"id":"informatyka-2017-maj-matura-rozszerzona/zad/6.4","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"6.4","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nPodaj długość najdłuższej linii pionowej (czyli ciągu kolejnych pikseli w tej samej kolumnie obrazka), złożonej z pikseli tej samej jasności.\n\nDla danych z pliku przyklad.txt wynikiem jest 198.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Najdłuższa linia pionowa o jednolitej jasności: 5 pikseli** (w `dane.txt`).\n\nDla `przyklad.txt`: 198.\n\nDla każdej kolumny przeglądamy wszystkie 200 wierszy z góry na dół i utrzymujemy aktualną długość ciągu identycznych wartości (\"streak\"). Wynikiem jest globalne maksimum tych streaków.\n\n## Sposób 1 - Python (najczytelniejszy)\n\n```python\n# Wczytaj obraz jako macierz [200][320]\nwith open('dane.txt') as f:\nobraz = [[int(x) for x in linia.split()] for linia in f]\n\nW, K = len(obraz), len(obraz[0]) # 200, 320\nmax_dl = 1\n\nfor c in range(K):\nbiezacy = 1\nfor r in range(1, W):\nif obraz[r][c] == obraz[r-1][c]:\nbiezacy += 1\nif biezacy > max_dl:\nmax_dl = biezacy\nelse:\nbiezacy = 1\n\nprint(max_dl) # 5\n\n## Sposób 2 - C++ (kolumna-po-kolumnie)\n\n```cpp\n#include <iostream>\n#include <fstream>\nusing namespace std;\n\nconst int W = 200, K = 320;\nint obraz[W][K];\n\nint main() {\nifstream plik(\"dane.txt\");\nfor (int r = 0; r < W; r++)\nfor (int c = 0; c < K; c++)\nplik >> obraz[r][c];\nint max_dl = 1;\nfor (int c = 0; c < K; c++) {\nint biezacy = 1;\nfor (int r = 1; r < W; r++) {\nif (obraz[r][c] == obraz[r-1][c]) {\nbiezacy++;\nif (biezacy > max_dl) max_dl = biezacy;\n} else {\nbiezacy = 1;\n}\n}\n}\ncout << max_dl << endl; // 5\nreturn 0;\n}\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram NajdluzszaLinia;\nvar\nobraz: array[1 200, 1 320] of Integer;\nr, c, biezacy, max_dl: Integer;\nf: TextFile;\nbegin\nAssignFile(f, 'dane.txt'); Reset(f);\nfor r := 1 to 200 do\nfor c := 1 to 320 do Read(f, obraz[r, c]);\nCloseFile(f);\nmax_dl := 1;\nfor c := 1 to 320 do\nbegin\nbiezacy := 1;\nfor r := 2 to 200 do\nif obraz[r, c] = obraz[r-1, c] then\nbegin\nInc(biezacy);\nif biezacy > max_dl then max_dl := biezacy;\nend\nelse\nbiezacy := 1;\nend;\nWriteln(max_dl); // 5\nend.\n\n## Reference algorytmiczny - najdłuższy podciąg jednakowych\n\n> Reference - Run-Length Encoding (najdłuższy run):\n> - Przeglądaj sekwencję jeden raz, utrzymując zmienną \"biezacy\" liczącą długość bieżącego ciągu.\n> - Gdy element się ZMIENIA, resetuj biezacy = 1; gdy się POWTARZA, zwiększaj.\n> - Po każdym kroku aktualizuj globalne maksimum.\n> - Złożoność: O(n) na sekwencję.\n> - Dla obrazu 200×320 = 64 000 pikseli: O(W · K) = O(64 000) operacji. Szybko.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.4, max 4 pkt):\n> - **4 pkt** - prawidłowa odpowiedź: **5**.\n> - **2 pkt** - odpowiedź **4** lub **6** (off-by-one error: liczone końce/granice przedziału lub błędna inicjalizacja).\n> - **0 pkt** - inna błędna odpowiedź lub brak.\n> - **UWAGA:** Nie przyznaje się 3 pkt i 1 pkt.\n\n## Typowe pułapki\n\n- **Liczenie linii POZIOMYCH zamiast PIONOWYCH** - pionowa = w tej samej KOLUMNIE, idziemy w dół. Częsta pomyłka kierunku iteracji.\n- **Inicjalizacja biezacy = 0 vs 1** - pierwszy piksel zaczyna ciąg, więc biezacy = 1. Inicjalizacja = 0 da off-by-one (odpowiedź 4 lub 6 zamiast 5).\n- **Reset biezacy = 0 zamiast 1** - gdy element zmienia się, nowa wartość zaczyna NOWY ciąg długości 1, nie 0.\n- **Brak aktualizacji max_dl PRZY PIERWSZYM piksele** - można pomylić i pominąć kolumny gdzie wszystkie 200 pikseli są takie same. Inicjalizacja max_dl = 1 lub aktualizacja po każdej iteracji.\n- **Indeksowanie 0 vs 1** - w Pascalu od 1, w Python/C++ od 0. Pętla wewnętrzna `for r in range(1, W)` (Python) lub `for r := 2 to 200` (Pascal).\n- **dane.txt vs przyklad.txt** - przyklad zwraca 198 (prawie cała kolumna), dane.txt tylko 5 (obraz różnorodny).\n\n## Złożoność obliczeniowa\n\n- Wczytanie: O(W × K) = O(64 000).\n- Główna pętla: O(W × K) = O(64 000) operacji.\n- **Całkowita: O(W × K)**, liniowa względem rozmiaru obrazu.\n- Pamięć: O(W × K) na macierz lub O(W) (jednej kolumny naraz, gdyby trzymać tylko bieżącą kolumnę).","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura"}]}