{"id":"informatyka-2019-maj-matura-rozszerzona/zad/5.2","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"5.2","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nNa przykład dla danych:\ndzień temperatura\n34 3,7\n35 3,4\n**36 3,5**\n**37 3,6**\n**38 3,7**\n39 3,5\npierwszym dniem ciągu spełniającym warunek zadania jest dzień 36, a ostatnim - 38.\n\nZnajdź najdłuższy ciąg kolejnych dni, w których temperatura zmierzona każdego dnia jest wyższa niż temperatura dnia poprzedniego. Jest tylko jeden taki ciąg. Podaj numer pierwszego i numer ostatniego dnia w takim ciągu.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Najdłuższy ciąg dni o monotonicznie rosnącej temperaturze:**\n- **Pierwszy dzień: 448**\n- **Ostatni dzień: 455**\n\n(Długość ciągu: 455 - 448 + 1 = **8 dni**)\n\n## Sposób 1 - Python (algorytm okna o jednym przebiegu)\n\n```python\n# Wczytaj dane: lista (dzien, temperatura)\ndane = []\nwith open('pogoda.txt', encoding='utf-8') as f:\nf.readline() # nagłówek\nfor linia in f:\npola = linia.strip().split(';')\ndzien = int(pola[0])\ntemp = float(pola[1].replace(',', '.'))\ndane.append((dzien, temp))\n\nnaj_start = naj_end = 0\nnaj_dl = 1\nbiezacy_start = 0\n\nfor i in range(1, len(dane)):\nif dane[i][1] > dane[i-1][1]:\n# kontynuacja rosnącego ciągu\ndl = i - biezacy_start + 1\nif dl > naj_dl:\nnaj_dl = dl\nnaj_start = biezacy_start\nnaj_end = i\nelse:\n# przerwanie - nowy ciąg startuje od i\nbiezacy_start = i\n\nprint(f'Pierwszy dzień: {dane[naj_start][0]}') # 448\nprint(f'Ostatni dzień: {dane[naj_end][0]}') # 455\n\n## Sposób 2 - arkusz kalkulacyjny (LibreOffice/Excel)\n\n**Pomocnicza kolumna F (długość bieżącego rosnącego ciągu):**\nF2 = 1\nF3 = JEŻELI(B3 > B2; F2 + 1; 1)\nSkopiuj F3 w dół do F501.\n\n**Znalezienie maksimum i jego pozycji:**\nG1 = MAX(F2:F501) # długość najdłuższego ciągu (= 8)\nG2 = PODAJ.POZYCJĘ(G1; F2:F501; 0) # wiersz końca ciągu\nNumer pierwszego dnia = G2 - G1 + 1 + 1 (offset wiersza nagłówka).\n\nKonkretnie: G1 = 8, G2 = 454 (indeks od 1 w pomocniczej kolumnie F2:F501), więc:\n- ostatni dzień: 455 (numer dnia z kolumny A)\n- pierwszy dzień: 448.\n\n## Sposób 3 - implementacja Pascal\n\n```pascal\nprogram NajdluzszyRosnacyCiag;\nvar\nf: TextFile;\nlinia: String;\ntemp: array[1 500] of Real;\ni, start, najStart, najEnd, najDl, dl: Integer;\nbegin\nAssignFile(f, 'pogoda.txt');\nReset(f);\nReadLn(f, linia); // nagłówek\nfor i := 1 to 500 do\nbegin\n// parsowanie linii (pomijam dla zwięzłości)\n// temp[i] :=\nend;\nCloseFile(f);\n\nstart := 1; najStart := 1; najEnd := 1; najDl := 1;\nfor i := 2 to 500 do\nbegin\nif temp[i] > temp[i-1] then\nbegin\ndl := i - start + 1;\nif dl > najDl then\nbegin\nnajDl := dl; najStart := start; najEnd := i;\nend;\nend\nelse\nstart := i;\nend;\n\nWriteLn('Pierwszy: ', najStart); // 448\nWriteLn('Ostatni: ', najEnd); // 455\nend.\n\n## Sposób 4 - implementacja C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <vector>\n#include <sstream>\nusing namespace std;\n\nint main() {\nifstream plik(\"pogoda.txt\");\nstring linia;\ngetline(plik, linia); // nagłówek\nvector<double> temp;\nwhile (getline(plik, linia)) {\n// parsowanie po średnikach\n// temp.push_back( );\n}\n\nint start = 0, najStart = 0, najEnd = 0, najDl = 1;\nfor (int i = 1; i < (int)temp.size(); i++) {\nif (temp[i] > temp[i-1]) {\nint dl = i - start + 1;\nif (dl > najDl) {\nnajDl = dl; najStart = start; najEnd = i;\n}\n} else start = i;\n}\ncout << \"Pierwszy: \" << najStart+1 << endl; // 448\ncout << \"Ostatni: \" << najEnd+1 << endl; // 455\nreturn 0;\n}\n\n## Reference informatyczny - najdłuższy podciąg rosnący kolejnych\n\n> Reference - Klasa problemu \"Longest run\" (kolejne rosnące):\n> - WAŻNE: To NIE jest LIS (Longest Increasing Subsequence). To **najdłuższy ciągły fragment rosnący** - wymaga ciągłości pozycji.\n> - Algorytm: jedno-przebiegowy O(n) - utrzymuj długość bieżącego rosnącego ciągu, resetuj gdy warunek złamany.\n> - Złożoność: O(n) czasu, O(1) pamięci.\n> - LIS to zupełnie inny problem: dopuszcza wybór niesąsiednich elementów, rozwiązywany w O(n log n).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.2, max 2 pkt):\n> - **2 pkt** - pełna odpowiedź, w tym:\n> - 1 pkt - poprawny początek (448)\n> - 1 pkt - poprawny koniec (455)\n> - **0 pkt** - błędna lub brak\n\n## Typowe pułapki\n\n- **`>=` zamiast `>`** - treść mówi WYŻSZA niż poprzednia, czyli ostre `>`. Pominięcie tego daje dłuższe ciągi z plateau (nie rosnące).\n- **Off-by-one przy resetowaniu start** - gdy warunek złamany, nowy ciąg startuje od `i` (NIE od `i+1`!), bo dzień `i` to potencjalny początek nowego ciągu.\n- **Format dziesiętny** - temperatura ma postać `19,3` (przecinek!), w Pythonie zamień na `.` przed konwersją.\n- **Włączenie nagłówka** - pomiń pierwszą linię.\n- **\"Najdłuższy\" vs \"pierwszy\"** - jest TYLKO JEDEN najdłuższy w pliku, więc nie ma niejasności.\n\n## Złożoność obliczeniowa\n\n- Jedno-przebiegowy algorytm: **O(n)** czasu, O(1) pamięci.\n- Dla 500 dni: ~500 operacji.\n- Z parsowaniem CSV: O(n · k), gdzie k = długość linii.","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 2019 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 5.1.</p>\n<p>Na przykład dla danych:<br>dzień temperatura<br>34 3,7<br>35 3,4<br><strong>36 3,5</strong><br><strong>37 3,6</strong><br><strong>38 3,7</strong><br>39 3,5<br>pierwszym dniem ciągu spełniającym warunek zadania jest dzień 36, a ostatnim - 38.</p>\n<p>Znajdź najdłuższy ciąg kolejnych dni, w których temperatura zmierzona każdego dnia jest wyższa niż temperatura dnia poprzedniego. Jest tylko jeden taki ciąg. Podaj numer pierwszego i numer ostatniego dnia w takim ciągu.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Najdłuższy ciąg dni o monotonicznie rosnącej temperaturze:</strong></p>\n<ul><li><strong>Pierwszy dzień: 448</strong></li><li><strong>Ostatni dzień: 455</strong></li></ul>\n<p>(Długość ciągu: 455 - 448 + 1 = <strong>8 dni</strong>)</p>\n<h4>Sposób 1 - Python (algorytm okna o jednym przebiegu)</h4>\n<p>```python</p>\n<h3>Wczytaj dane: lista (dzien, temperatura)</h3>\n<p>dane = []<br>with open(&#x27;pogoda.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.readline() # nagłówek<br>for linia in f:<br>pola = linia.strip().split(&#x27;;&#x27;)<br>dzien = int(pola[0])<br>temp = float(pola[1].replace(&#x27;,&#x27;, &#x27;.&#x27;))<br>dane.append((dzien, temp))</p>\n<p>naj_start = naj_end = 0<br>naj_dl = 1<br>biezacy_start = 0</p>\n<p>for i in range(1, len(dane)):<br>if dane[i][1] &gt; dane[i-1][1]:</p>\n<h3>kontynuacja rosnącego ciągu</h3>\n<p>dl = i - biezacy_start + 1<br>if dl &gt; naj_dl:<br>naj_dl = dl<br>naj_start = biezacy_start<br>naj_end = i<br>else:</p>\n<h3>przerwanie - nowy ciąg startuje od i</h3>\n<p>biezacy_start = i</p>\n<p>print(f&#x27;Pierwszy dzień: {dane[naj_start][0]}&#x27;) # 448<br>print(f&#x27;Ostatni dzień: {dane[naj_end][0]}&#x27;) # 455</p>\n<h4>Sposób 2 - arkusz kalkulacyjny (LibreOffice/Excel)</h4>\n<p><strong>Pomocnicza kolumna F (długość bieżącego rosnącego ciągu):</strong><br>F2 = 1<br>F3 = JEŻELI(B3 &gt; B2; F2 + 1; 1)<br>Skopiuj F3 w dół do F501.</p>\n<p><strong>Znalezienie maksimum i jego pozycji:</strong><br>G1 = MAX(F2:F501) # długość najdłuższego ciągu (= 8)<br>G2 = PODAJ.POZYCJĘ(G1; F2:F501; 0) # wiersz końca ciągu<br>Numer pierwszego dnia = G2 - G1 + 1 + 1 (offset wiersza nagłówka).</p>\n<p>Konkretnie: G1 = 8, G2 = 454 (indeks od 1 w pomocniczej kolumnie F2:F501), więc:</p>\n<ul><li>ostatni dzień: 455 (numer dnia z kolumny A)</li><li>pierwszy dzień: 448.</li></ul>\n<h4>Sposób 3 - implementacja Pascal</h4>\n<p>```pascal<br>program NajdluzszyRosnacyCiag;<br>var<br>f: TextFile;<br>linia: String;<br>temp: array[1 500] of Real;<br>i, start, najStart, najEnd, najDl, dl: Integer;<br>begin<br>AssignFile(f, &#x27;pogoda.txt&#x27;);<br>Reset(f);<br>ReadLn(f, linia); // nagłówek<br>for i := 1 to 500 do<br>begin<br>// parsowanie linii (pomijam dla zwięzłości)<br>// temp[i] :=<br>end;<br>CloseFile(f);</p>\n<p>start := 1; najStart := 1; najEnd := 1; najDl := 1;<br>for i := 2 to 500 do<br>begin<br>if temp[i] &gt; temp[i-1] then<br>begin<br>dl := i - start + 1;<br>if dl &gt; najDl then<br>begin<br>najDl := dl; najStart := start; najEnd := i;<br>end;<br>end<br>else<br>start := i;<br>end;</p>\n<p>WriteLn(&#x27;Pierwszy: &#x27;, najStart); // 448<br>WriteLn(&#x27;Ostatni: &#x27;, najEnd); // 455<br>end.</p>\n<h4>Sposób 4 - implementacja C++</h4>\n<p>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;vector&gt;<br>#include &lt;sstream&gt;<br>using namespace std;</p>\n<p>int main() {<br>ifstream plik(&quot;pogoda.txt&quot;);<br>string linia;<br>getline(plik, linia); // nagłówek<br>vector&lt;double&gt; temp;<br>while (getline(plik, linia)) {<br>// parsowanie po średnikach<br>// temp.push_back( );<br>}</p>\n<p>int start = 0, najStart = 0, najEnd = 0, najDl = 1;<br>for (int i = 1; i &lt; (int)temp.size(); i++) {<br>if (temp[i] &gt; temp[i-1]) {<br>int dl = i - start + 1;<br>if (dl &gt; najDl) {<br>najDl = dl; najStart = start; najEnd = i;<br>}<br>} else start = i;<br>}<br>cout &lt;&lt; &quot;Pierwszy: &quot; &lt;&lt; najStart+1 &lt;&lt; endl; // 448<br>cout &lt;&lt; &quot;Ostatni: &quot; &lt;&lt; najEnd+1 &lt;&lt; endl; // 455<br>return 0;<br>}</p>\n<h4>Reference informatyczny - najdłuższy podciąg rosnący kolejnych</h4>\n<blockquote>Reference - Klasa problemu &quot;Longest run&quot; (kolejne rosnące):<br>- WAŻNE: To NIE jest LIS (Longest Increasing Subsequence). To <strong>najdłuższy ciągły fragment rosnący</strong> - wymaga ciągłości pozycji.<br>- Algorytm: jedno-przebiegowy O(n) - utrzymuj długość bieżącego rosnącego ciągu, resetuj gdy warunek złamany.<br>- Złożoność: O(n) czasu, O(1) pamięci.<br>- LIS to zupełnie inny problem: dopuszcza wybór niesąsiednich elementów, rozwiązywany w O(n log n).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.2, max 2 pkt):<br>- <strong>2 pkt</strong> - pełna odpowiedź, w tym:<br>- 1 pkt - poprawny początek (448)<br>- 1 pkt - poprawny koniec (455)<br>- <strong>0 pkt</strong> - błędna lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong><code>&gt;=</code> zamiast <code>&gt;</code></strong> - treść mówi WYŻSZA niż poprzednia, czyli ostre <code>&gt;</code>. Pominięcie tego daje dłuższe ciągi z plateau (nie rosnące).</li><li><strong>Off-by-one przy resetowaniu start</strong> - gdy warunek złamany, nowy ciąg startuje od <code>i</code> (NIE od <code>i+1</code>!), bo dzień <code>i</code> to potencjalny początek nowego ciągu.</li><li><strong>Format dziesiętny</strong> - temperatura ma postać <code>19,3</code> (przecinek!), w Pythonie zamień na <code>.</code> przed konwersją.</li><li><strong>Włączenie nagłówka</strong> - pomiń pierwszą linię.</li><li><strong>&quot;Najdłuższy&quot; vs &quot;pierwszy&quot;</strong> - jest TYLKO JEDEN najdłuższy w pliku, więc nie ma niejasności.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Jedno-przebiegowy algorytm: <strong>O(n)</strong> czasu, O(1) pamięci.</li><li>Dla 500 dni: ~500 operacji.</li><li>Z parsowaniem CSV: O(n · k), gdzie k = długość linii.</li></ul>"}]}