{"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","text_html":"<p>Zadanie 1.2. (0-4)<br>Zapisz (w postaci pseudokodu, listy kroków lub w wybranym języku programowania) algorytm<br>obliczający największe pole powierzchni prostokąta, które nie jest podzielne przez p, a długości<br>sąsiednich boków tego prostokąta należą do zbioru A i są różne.<br>Przy ocenie brana będzie pod uwagę złożoność obliczeniowa Twojego algorytmu.<br>Uwaga:<br>W zapisie algorytmu możesz wykorzystywać tylko następujące operacje arytmetyczne:<br>dodawanie, odejmowanie, mnożenie, dzielenie całkowite i obliczanie reszty z dzielenia.<br>Specyfikacja:<br>Dane:<br>n</p>\n<ul><li>liczba całkowita większa od 1</li></ul>\n<p>A[1 n] - tablica zawierająca n różnych, dodatnich liczb całkowitych<br>p</p>\n<ul><li>liczba pierwsza</li></ul>\n<p>Wynik:<br>S</p>\n<ul><li>największe pole powierzchni prostokąta, które nie jest podzielne przez p,</li></ul>\n<p>a długości sąsiednich boków tego prostokąta są różne i zawarte w tablicy A;<br>jeśli nie można zbudować takiego prostokąta, wynikiem powinno być 0 (zero)<br>MIN_1R<br>Algorytm<br>Wypełnia<br>egzaminator<br>Nr zadania<br>1.1.<br>1.2.<br>Maks. liczba pkt.<br>2<br>4<br>Uzyskana liczba pkt.<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 1.2. (0-4)<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji […],<br>z zastosowaniem podejścia algorytmicznego.</p>\n<ol><li>Rozwiązywanie problemów</li></ol>\n<p>i podejmowanie decyzji […], stosowanie<br>podejścia algorytmicznego.<br>Zdający:</p>\n<ol><li>stosuje podejście algorytmiczne do</li></ol>\n<p>rozwiązywania problemu;</p>\n<ol><li>dobiera efektywny algorytm do</li></ol>\n<p>rozwiązania sytuacji problemowej i zapisuje<br>go w wy branej notacji;</p>\n<ol><li>opisuje podstawowe algorytmy i stosuje:</li></ol>\n<p>a) algorytmy na liczbach całkowitych;<br>Schemat punktowania<br>4 p. - za prawidłowe rozwiązanie o złożoności liniowej, w tym:<br>3 p. - za poprawne wyznaczenie długości dwóch najdłuższych boków, w tym<br>2 p. - za wyznaczenie długości dwóch najdłuższych boków.<br>Uwaga: za wyznaczanie długości dwóch najdłuższych boków, w tym tylko jednej poprawnej -<br>1 punkt<br>1 p. - za sprawdzanie podzielności przez p.<br>1 p. - za wyznaczenie największego pola prostokąta o bokach różnej długości i uwzględnienie<br>wyniku S = 0 - 1 punkt<br>2 p. - za prawidłowe rozwiązanie o złożoności innej niż liniowa, w tym<br>1 p. - sprawdzanie podzielności przez p.<br>1 p. - za wyznaczenie największego pola prostokąta o bokach różnej długości oraz<br>uwzględnienie wyniku S = 0.<br>0 p. - za podanie błędnej odpowiedzi albo za brak odpowiedzi.<br>Przykładowe rozwiązania:<br>1.Algorytm o złożoności liniowej<br>int max1,max2;<br>max1 = max2 = 0;<br>for(int i = 1; i &lt;= n; ++i)<br>{<br>if(A[i] % p != 0)<br>{<br>if(A[i] &gt; max1)<br>{<br>max2 = max1;<br>max1 = A[i];<br>}<br>else if(A[i] &gt; max2)<br>max2 = A[i];<br>}<br>}<br>cout &lt;&lt; max1 * max2;</p>\n<ol><li>Algorytm o złożoności kwadratowej</li></ol>\n<p>int maxpole = 0;<br>for(int i = 1; i &lt; n; ++i)<br>{<br>for(int j = i + 1; j &lt;=n; ++j)<br>{<br>int pole = A[i] * A[j];<br>if(pole % p != 0)<br>{<br>if(pole &gt; maxpole)<br>maxpole = pole;<br>}<br>}<br>}<br>cout &lt;&lt; maxpole;</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>Algorytm liniowy O(n) - jednokrotne przejście tablicy z aktualizacją dwóch największych elementów niepodzielnych przez p:</p>\n<p>max1 ← 0<br>max2 ← 0<br>dla i = 1, 2, , n wykonuj:<br>jeżeli A[i] mod p ≠ 0:<br>jeżeli A[i] &gt; max1:<br>max2 ← max1<br>max1 ← A[i]<br>w przeciwnym razie jeżeli A[i] &gt; max2:<br>max2 ← A[i]<br>S ← max1 * max2</p>\n<p><strong>Wynik:</strong> jeśli max2 = 0 (mniej niż 2 liczby spełniają warunek) → S = 0. W przeciwnym razie S = max1 · max2.</p>\n<h4>Sposób 1 - idea algorytmu liniowego</h4>\n<p>Kluczowa 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 <strong>nie są podzielne przez p</strong>.</p>\n<p>W jednym przejściu pętli utrzymujemy dwa zmienne:</p>\n<ul><li><code>max1</code> - największa dotąd zaobserwowana liczba niepodzielna przez p,</li><li><code>max2</code> - druga co do wielkości.</li></ul>\n<p>Przy nowym elemencie A[i] (jeśli niepodzielny przez p):</p>\n<ul><li>jeśli A[i] &gt; max1 → max2 staje się starym max1, a max1 := A[i],</li><li>inaczej jeśli A[i] &gt; max2 → max2 := A[i].</li></ul>\n<p>Gdy max2 = 0, to znaczy że istnieje co najwyżej jedna liczba niepodzielna przez p → S = 0 (max1 * 0 = 0).</p>\n<h4>Sposób 2 - implementacja w 3 językach</h4>\n<p><strong>Python:</strong><br>```python<br>def max_pole(A, p):<br>max1, max2 = 0, 0<br>for x in A:<br>if x % p != 0:<br>if x &gt; max1:<br>max2 = max1<br>max1 = x<br>elif x &gt; max2:<br>max2 = x<br>return max1 * max2</p>\n<p>print(max_pole([7, 5, 11, 33], 3)) # 77<br>print(max_pole([4, 34, 16, 8, 6, 22, 14, 12, 2, 7], 2)) # 0</p>\n<p><strong>Pascal:</strong><br>```pascal<br>function MaxPole(A: array of LongInt; n, p: LongInt): LongInt;<br>var i, max1, max2: LongInt;<br>begin<br>max1 := 0; max2 := 0;<br>for i := 0 to n - 1 do<br>if A[i] mod p &lt;&gt; 0 then<br>begin<br>if A[i] &gt; max1 then<br>begin<br>max2 := max1;<br>max1 := A[i];<br>end<br>else if A[i] &gt; max2 then<br>max2 := A[i];<br>end;<br>MaxPole := max1 * max2;<br>end;</p>\n<p><strong>C++:</strong><br>```cpp<br>long long maxPole(int A[], int n, int p) {<br>long long max1 = 0, max2 = 0;<br>for (int i = 0; i &lt; n; i++) {<br>if (A[i] % p != 0) {<br>if (A[i] &gt; max1) {<br>max2 = max1;<br>max1 = A[i];<br>} else if (A[i] &gt; max2) {<br>max2 = A[i];<br>}<br>}<br>}<br>return max1 * max2;<br>}</p>\n<h4>Reference algorytmiczny - wyszukiwanie dwóch największych</h4>\n<blockquote>Reference - Dwa największe elementy w tablicy:<br>- Algorytm liniowy O(n): jedna pętla, dwie zmienne max1, max2.<br>- Aktualizacja: gdy x &gt; max1, przesuń max1→max2, max1=x; w innym razie gdy x &gt; max2, max2=x.<br>- Alternatywa: posortuj (O(n log n)) i weź dwa pierwsze - dłużej.<br>- W naszym zadaniu dodatkowy filtr <code>A[i] mod p ≠ 0</code>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 1.2, max 4 pkt):<br>- <strong>4 pkt</strong> - algorytm o złożoności liniowej w pełni poprawny, w tym:<br>- 2 pkt - wyznaczenie długości dwóch najdłuższych boków (1 pkt - tylko jednej)<br>- 1 pkt - sprawdzanie podzielności przez p (mod p ≠ 0)<br>- 1 pkt - uwzględnienie różnych długości boków i przypadku S = 0<br>- <strong>2 pkt</strong> - rozwiązanie o złożoności gorszej niż liniowa (np. O(n²) - dwie pętle, lub O(n log n) - sortowanie + wybór)<br>- <strong>0 pkt</strong> - błędne lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Pominięcie warunku „boki różne&quot;</strong> - gdy A zawiera duplikaty (treść zadania mówi „różne&quot;, więc OK, ale przy implementacji uważać).</li><li><strong>Pominięcie S = 0 dla niewystarczającej liczby kandydatów</strong> - gdy mniej niż 2 elementy są niepodzielne przez p, max2 pozostaje 0, S = max1·0 = 0 (algorytm sam obsługuje to dzięki inicjalizacji).</li><li><strong>Nieefektywne rozwiązanie</strong> - 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ę.</li><li><strong>Wykorzystanie zabronionych operacji</strong> - treść pozwala tylko +, -, *, div, mod. Bez sortowania bibliotecznego (sort()).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li><strong>Czas: O(n)</strong> - jedna pętla po n elementach tablicy.</li><li><strong>Pamięć: O(1)</strong> - tylko stałe zmienne (max1, max2, i).</li><li><strong>Porównanie:</strong> sortowanie + wybór dwóch pierwszych: O(n log n); brute force par: O(n²). Liniowy jest optymalny.</li></ul>"}]}