{"id":"informatyka-2018-maj-matura-rozszerzona/zad/5.4","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"5.4","points":5,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPoniżej opisano cykl pracy zbiornika retencyjnego:\n1) Na początku doby, zaraz po północy, wykonywany jest pomiar objętości wody w zbiorniku i na jego podstawie realizuje się pozostałe działania.\n2) Jeśli pomiar wskazuje w zbiorniku więcej niż 1 000 000 m³ wody, to nastąpiło tzw. przepełnienie zbiornika. W takiej sytuacji, niezwłocznie po wykonaniu pomiaru i stwierdzeniu przepełnienia, nadmiar wody powyżej 1 000 000 m³ jest wypuszczany ze zbiornika.\n3) Codziennie rano (o godzinie 8) ze zbiornika wypuszcza się 2% objętości wody wykazanej przez pomiar zaraz po północy. Ilość wypuszczanej wody zaokrągla się w górę do pełnych metrów sześciennych.\n\nUwaga: pomiar wykonany po północy 2008-02-01 wskazał 338 406 m³ wody.\n\nUwzględnij opisany cykl pracy zbiornika retencyjnego oraz codzienne dopływy wody z Wirki i przyjmij, że pomiar w dniu 2008-01-01 wskazywał 500 000 m³ wody, a następnie:\n\na) podaj dzień, w którym pierwszy raz wypuszczono nadmiar wody po przepełnieniu,\n\nb) podaj, w ilu dniach z podanego okresu (tj. od 2008-01-01 do 2017-12-31) w zbiorniku w momencie pomiaru znajdowało się co najmniej 800 000 m³ wody,\n\nc) podaj, ile najwięcej wody znalazłoby się w podanym okresie (tj. od 2008-01-01 do 2017-12-31) w zbiorniku (w momencie pomiaru), gdyby całkowicie zrezygnować z procedury wypuszczania nadmiaru wody powyżej 1 000 000 m³, a zbiornik miałby nieograniczoną pojemność.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**a) Data pierwszego wypuszczenia nadmiaru: 2015-04-19**\n\n**b) Liczba dni z ≥ 800 000 m³: 188 dni**\n\n**c) Maksimum bez wypuszczania nadmiaru: 1 399 242 m³**\n\n## Sposób 1 - symulacja krok po kroku\n\n**Reguły cyklu pracy zbiornika:**\n1. Pomiar po północy: V_pomiar = V_z_poprzedniego_dnia + dopływ_z_poprzedniej_doby.\n2. Jeśli V_pomiar > 1 000 000 → przepełnienie → V := 1 000 000 (nadmiar wypuszczony tego dnia).\n3. Rano (8:00) wypuszczane 2% pomiaru, zaokrąglone w górę: V := V_pomiar - ⌈0.02 · V_pomiar⌉.\n4. Następnie w ciągu doby wpływa dopływ z bieżącej daty (do następnego pomiaru).\n\n**WAŻNE - niejasność interpretacji:** Treść mówi, że pomiar 2008-02-01 to 338 406. Sprawdźmy logikę:\n- 2008-01-01: pomiar = 500 000.\n- 2008-01-01 rano: wypuść 2% = 10 000 → V = 490 000.\n- 2008-01-01 doba: dopływ 2275 → V_koniec_doby = 492 275.\n- 2008-01-02 pomiar = 492 275.\n\nKontynuując 31 dni do 2008-02-01 osiągamy 338 406 (zgadzane się z treścią).\n\n## Sposób 2 - implementacja Python\n\n```python\nimport math\n\n# Wczytaj dane\nlinie = []\nwith open('woda.txt', encoding='utf-8') as f:\nfor linia in f:\ncz = linia.strip().split('\\t')\nif len(cz) == 2:\ndata, dop = cz\nlinie.append((data, int(dop)))\n\n# Symulacja\nV = 500000 # stan początkowy 2008-01-01\nliczba_dni_ge_800k = 0\ndata_przepelnienie = None\nmax_V_pomiar = 0 # dla podpunktu c)\nV_bez_limitu = 500000 # symulacja bez procedury wypuszczania nadmiaru\nmax_V_bez_limitu = 0\n\nfor data, dop in linie:\n# pomiar po północy = V (z końca poprzedniej doby)\nV_pomiar = V\n# podpunkt b): czy >= 800 000\nif V_pomiar >= 800000:\nliczba_dni_ge_800k += 1\n# podpunkt a): czy przepełnienie\nif V_pomiar > 1000000 and data_przepelnienie is None:\ndata_przepelnienie = data\n# 1) wypuszczenie nadmiaru\nif V_pomiar > 1000000:\nV_pomiar = 1000000\n# 2) wypuszczenie 2% (zaokr. w górę)\nwypust = math.ceil(0.02 * V_pomiar)\nV_po_wypuszczeniu = V_pomiar - wypust\n# 3) doba: dopływ\nV = V_po_wypuszczeniu + dop\n# symulacja bez limitu (podpunkt c)\nV_bez_pomiar = V_bez_limitu\nif V_bez_pomiar > max_V_bez_limitu:\nmax_V_bez_limitu = V_bez_pomiar\nwypust_bl = math.ceil(0.02 * V_bez_pomiar)\nV_bez_limitu = V_bez_pomiar - wypust_bl + dop\n\nprint(f\"a) Pierwsze wypuszczenie: {data_przepelnienie}\") # 2015-04-19\nprint(f\"b) Dni z V >= 800000: {liczba_dni_ge_800k}\") # 188\nprint(f\"c) Max V (bez limitu): {max_V_bez_limitu}\") # 1399242\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Konstrukcja:**\n1. Kolumny A (data), B (dopływ).\n2. C2 = 500000 (stan początkowy 2008-01-01).\n3. C3 i niżej - pomiar = wartość z poprzedniego dnia po wszystkich operacjach.\n4. D = `=JEŻELI(C2>1000000; 1000000; C2)` (po wypuszczeniu nadmiaru).\n5. E = `=ZAOKR.GÓRA(D2*0,02; 0)` (wypust 2%).\n6. F = `=D2 - E2 + B2` (stan na koniec doby).\n7. C3 = `=F2` - pomiar następnego dnia.\n\n**Pytania:**\n- a) Najmniejszy wiersz z C > 1 000 000 → data w A.\n- b) `=LICZ.JEŻELI(C:C; \">=800000\")` → 188.\n- c) Druga symulacja bez kroku 4 (bez przepełnienia) → MAX → 1 399 242.\n\n## Sposób 4 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <cmath>\nusing namespace std;\n\nint main() {\nifstream f(\"woda.txt\");\ndouble V = 500000;\nint liczba_ge_800k = 0;\nstring data_przep = \"\";\ndouble V_bez = 500000, max_bez = 0;\nstring data, dopStr;\nwhile (f >> data >> dopStr) {\nint dop = stoi(dopStr);\ndouble V_pomiar = V;\nif (V_pomiar >= 800000) liczba_ge_800k++;\nif (V_pomiar > 1000000 && data_przep.empty()) data_przep = data;\nif (V_pomiar > 1000000) V_pomiar = 1000000;\ndouble wypust = ceil(0.02 * V_pomiar);\nV = V_pomiar - wypust + dop;\n// symulacja bez limitu\ndouble Vb_pomiar = V_bez;\nif (Vb_pomiar > max_bez) max_bez = Vb_pomiar;\ndouble wypust_b = ceil(0.02 * Vb_pomiar);\nV_bez = Vb_pomiar - wypust_b + dop;\n}\ncout << \"a) \" << data_przep << \" b) \" << liczba_ge_800k << \" c) \" << max_bez << endl;\nreturn 0;\n}\n\n## Reference informatyczny - symulacja krok po kroku\n\n> Reference - Symulacja stanu z regułami:\n> - Iteruj po krokach czasowych.\n> - W każdym kroku: zapisz stan, zastosuj reguły w określonej kolejności.\n> - Akumuluj statystyki (liczniki, maksima) w trakcie iteracji.\n>\n> Reference - Zaokrąglenie w górę:\n> - **Python**: `math.ceil(x)` lub `-(-x // 1)`.\n> - **C++**: `ceil(x)` (z `<cmath>`).\n> - **Pascal**: `Ceil(x)` (z `Math`).\n> - **Arkusz**: `=ZAOKR.GÓRA(x; 0)`.\n>\n> Reference - Stan zbiornika:\n> - Volume balance: V_next = V_current - wypust + dopływ.\n> - Constraint: V ≤ pojemność maksymalna (1 mln tu).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.4, max 5 pkt):\n> - **2 pkt** za podpunkt a) - data 2015-04-19\n> - **1 pkt** za podpunkt b) - 188 dni\n> - **2 pkt** za podpunkt c) - 1 399 242 m³\n> - **0 pkt** - błędne lub brak\n\n## Typowe pułapki\n\n- **Kolejność operacji** - kluczowa! Pomiar PRZED wypuszczeniem nadmiaru PRZED wypuszczeniem 2% PRZED dopływem.\n- **Zaokrąglenie 2% w dół zamiast w górę** - daje minimalnie inne wyniki kumulatywnie.\n- **Pomiar bieżącego dnia vs koniec poprzedniego** - pomiar TO STAN po dobie poprzedniej (= V z końca poprzedniej iteracji).\n- **Mylenie \"przepełnienie\" z \"wypuszczeniem 2%\"** - to dwie różne operacje. Wypuszczenie nadmiaru tylko gdy > 1 000 000.\n- **Granica `>=` vs `>`** - treść: \"więcej niż 1 000 000\" = `> 1 000 000`. Pomiar równy 1 000 000 NIE jest przepełnieniem.\n- **Off-by-one przy liczbie dni** - `>=` 800 000 (\"co najmniej\"), nie `>`.\n\n## Złożoność obliczeniowa\n\n- Symulacja: O(N) gdzie N = 3653.\n- Pamięć: O(1) (zmienne, brak tablic).\n- **Łącznie: O(N) ≈ 3653 iteracji.**","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 2018 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 5.1.</p>\n<p>Poniżej opisano cykl pracy zbiornika retencyjnego:</p>\n<ol><li>Na początku doby, zaraz po północy, wykonywany jest pomiar objętości wody w zbiorniku i na jego podstawie realizuje się pozostałe działania.</li><li>Jeśli pomiar wskazuje w zbiorniku więcej niż 1 000 000 m³ wody, to nastąpiło tzw. przepełnienie zbiornika. W takiej sytuacji, niezwłocznie po wykonaniu pomiaru i stwierdzeniu przepełnienia, nadmiar wody powyżej 1 000 000 m³ jest wypuszczany ze zbiornika.</li><li>Codziennie rano (o godzinie 8) ze zbiornika wypuszcza się 2% objętości wody wykazanej przez pomiar zaraz po północy. Ilość wypuszczanej wody zaokrągla się w górę do pełnych metrów sześciennych.</li></ol>\n<p>Uwaga: pomiar wykonany po północy 2008-02-01 wskazał 338 406 m³ wody.</p>\n<p>Uwzględnij opisany cykl pracy zbiornika retencyjnego oraz codzienne dopływy wody z Wirki i przyjmij, że pomiar w dniu 2008-01-01 wskazywał 500 000 m³ wody, a następnie:</p>\n<p>a) podaj dzień, w którym pierwszy raz wypuszczono nadmiar wody po przepełnieniu,</p>\n<p>b) podaj, w ilu dniach z podanego okresu (tj. od 2008-01-01 do 2017-12-31) w zbiorniku w momencie pomiaru znajdowało się co najmniej 800 000 m³ wody,</p>\n<p>c) podaj, ile najwięcej wody znalazłoby się w podanym okresie (tj. od 2008-01-01 do 2017-12-31) w zbiorniku (w momencie pomiaru), gdyby całkowicie zrezygnować z procedury wypuszczania nadmiaru wody powyżej 1 000 000 m³, a zbiornik miałby nieograniczoną pojemność.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>a) Data pierwszego wypuszczenia nadmiaru: 2015-04-19</strong></p>\n<p><strong>b) Liczba dni z ≥ 800 000 m³: 188 dni</strong></p>\n<p><strong>c) Maksimum bez wypuszczania nadmiaru: 1 399 242 m³</strong></p>\n<h4>Sposób 1 - symulacja krok po kroku</h4>\n<p><strong>Reguły cyklu pracy zbiornika:</strong></p>\n<ol><li>Pomiar po północy: V_pomiar = V_z_poprzedniego_dnia + dopływ_z_poprzedniej_doby.</li><li>Jeśli V_pomiar &gt; 1 000 000 → przepełnienie → V := 1 000 000 (nadmiar wypuszczony tego dnia).</li><li>Rano (8:00) wypuszczane 2% pomiaru, zaokrąglone w górę: V := V_pomiar - ⌈0.02 · V_pomiar⌉.</li><li>Następnie w ciągu doby wpływa dopływ z bieżącej daty (do następnego pomiaru).</li></ol>\n<p><strong>WAŻNE - niejasność interpretacji:</strong> Treść mówi, że pomiar 2008-02-01 to 338 406. Sprawdźmy logikę:</p>\n<ul><li>2008-01-01: pomiar = 500 000.</li><li>2008-01-01 rano: wypuść 2% = 10 000 → V = 490 000.</li><li>2008-01-01 doba: dopływ 2275 → V_koniec_doby = 492 275.</li><li>2008-01-02 pomiar = 492 275.</li></ul>\n<p>Kontynuując 31 dni do 2008-02-01 osiągamy 338 406 (zgadzane się z treścią).</p>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>import math</p>\n<h3>Wczytaj dane</h3>\n<p>linie = []<br>with open(&#x27;woda.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>for linia in f:<br>cz = linia.strip().split(&#x27;\\t&#x27;)<br>if len(cz) == 2:<br>data, dop = cz<br>linie.append((data, int(dop)))</p>\n<h3>Symulacja</h3>\n<p>V = 500000 # stan początkowy 2008-01-01<br>liczba_dni_ge_800k = 0<br>data_przepelnienie = None<br>max_V_pomiar = 0 # dla podpunktu c)<br>V_bez_limitu = 500000 # symulacja bez procedury wypuszczania nadmiaru<br>max_V_bez_limitu = 0</p>\n<p>for data, dop in linie:</p>\n<h3>pomiar po północy = V (z końca poprzedniej doby)</h3>\n<p>V_pomiar = V</p>\n<h3>podpunkt b): czy &gt;= 800 000</h3>\n<p>if V_pomiar &gt;= 800000:<br>liczba_dni_ge_800k += 1</p>\n<h3>podpunkt a): czy przepełnienie</h3>\n<p>if V_pomiar &gt; 1000000 and data_przepelnienie is None:<br>data_przepelnienie = data</p>\n<h3>1) wypuszczenie nadmiaru</h3>\n<p>if V_pomiar &gt; 1000000:<br>V_pomiar = 1000000</p>\n<h3>2) wypuszczenie 2% (zaokr. w górę)</h3>\n<p>wypust = math.ceil(0.02 * V_pomiar)<br>V_po_wypuszczeniu = V_pomiar - wypust</p>\n<h3>3) doba: dopływ</h3>\n<p>V = V_po_wypuszczeniu + dop</p>\n<h3>symulacja bez limitu (podpunkt c)</h3>\n<p>V_bez_pomiar = V_bez_limitu<br>if V_bez_pomiar &gt; max_V_bez_limitu:<br>max_V_bez_limitu = V_bez_pomiar<br>wypust_bl = math.ceil(0.02 * V_bez_pomiar)<br>V_bez_limitu = V_bez_pomiar - wypust_bl + dop</p>\n<p>print(f&quot;a) Pierwsze wypuszczenie: {data_przepelnienie}&quot;) # 2015-04-19<br>print(f&quot;b) Dni z V &gt;= 800000: {liczba_dni_ge_800k}&quot;) # 188<br>print(f&quot;c) Max V (bez limitu): {max_V_bez_limitu}&quot;) # 1399242</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<p><strong>Konstrukcja:</strong></p>\n<ol><li>Kolumny A (data), B (dopływ).</li><li>C2 = 500000 (stan początkowy 2008-01-01).</li><li>C3 i niżej - pomiar = wartość z poprzedniego dnia po wszystkich operacjach.</li><li>D = <code>=JEŻELI(C2&gt;1000000; 1000000; C2)</code> (po wypuszczeniu nadmiaru).</li><li>E = <code>=ZAOKR.GÓRA(D2*0,02; 0)</code> (wypust 2%).</li><li>F = <code>=D2 - E2 + B2</code> (stan na koniec doby).</li><li>C3 = <code>=F2</code> - pomiar następnego dnia.</li></ol>\n<p><strong>Pytania:</strong></p>\n<ul><li>a) Najmniejszy wiersz z C &gt; 1 000 000 → data w A.</li><li>b) <code>=LICZ.JEŻELI(C:C; &quot;&gt;=800000&quot;)</code> → 188.</li><li>c) Druga symulacja bez kroku 4 (bez przepełnienia) → MAX → 1 399 242.</li></ul>\n<h4>Sposób 4 - C++</h4>\n<p>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;string&gt;<br>#include &lt;cmath&gt;<br>using namespace std;</p>\n<p>int main() {<br>ifstream f(&quot;woda.txt&quot;);<br>double V = 500000;<br>int liczba_ge_800k = 0;<br>string data_przep = &quot;&quot;;<br>double V_bez = 500000, max_bez = 0;<br>string data, dopStr;<br>while (f &gt;&gt; data &gt;&gt; dopStr) {<br>int dop = stoi(dopStr);<br>double V_pomiar = V;<br>if (V_pomiar &gt;= 800000) liczba_ge_800k++;<br>if (V_pomiar &gt; 1000000 &amp;&amp; data_przep.empty()) data_przep = data;<br>if (V_pomiar &gt; 1000000) V_pomiar = 1000000;<br>double wypust = ceil(0.02 * V_pomiar);<br>V = V_pomiar - wypust + dop;<br>// symulacja bez limitu<br>double Vb_pomiar = V_bez;<br>if (Vb_pomiar &gt; max_bez) max_bez = Vb_pomiar;<br>double wypust_b = ceil(0.02 * Vb_pomiar);<br>V_bez = Vb_pomiar - wypust_b + dop;<br>}<br>cout &lt;&lt; &quot;a) &quot; &lt;&lt; data_przep &lt;&lt; &quot; b) &quot; &lt;&lt; liczba_ge_800k &lt;&lt; &quot; c) &quot; &lt;&lt; max_bez &lt;&lt; endl;<br>return 0;<br>}</p>\n<h4>Reference informatyczny - symulacja krok po kroku</h4>\n<blockquote>Reference - Symulacja stanu z regułami:<br>- Iteruj po krokach czasowych.<br>- W każdym kroku: zapisz stan, zastosuj reguły w określonej kolejności.<br>- Akumuluj statystyki (liczniki, maksima) w trakcie iteracji.<br><br>Reference - Zaokrąglenie w górę:<br>- <strong>Python</strong>: <code>math.ceil(x)</code> lub <code>-(-x // 1)</code>.<br>- <strong>C++</strong>: <code>ceil(x)</code> (z <code>&lt;cmath&gt;</code>).<br>- <strong>Pascal</strong>: <code>Ceil(x)</code> (z <code>Math</code>).<br>- <strong>Arkusz</strong>: <code>=ZAOKR.GÓRA(x; 0)</code>.<br><br>Reference - Stan zbiornika:<br>- Volume balance: V_next = V_current - wypust + dopływ.<br>- Constraint: V ≤ pojemność maksymalna (1 mln tu).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.4, max 5 pkt):<br>- <strong>2 pkt</strong> za podpunkt a) - data 2015-04-19<br>- <strong>1 pkt</strong> za podpunkt b) - 188 dni<br>- <strong>2 pkt</strong> za podpunkt c) - 1 399 242 m³<br>- <strong>0 pkt</strong> - błędne lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Kolejność operacji</strong> - kluczowa! Pomiar PRZED wypuszczeniem nadmiaru PRZED wypuszczeniem 2% PRZED dopływem.</li><li><strong>Zaokrąglenie 2% w dół zamiast w górę</strong> - daje minimalnie inne wyniki kumulatywnie.</li><li><strong>Pomiar bieżącego dnia vs koniec poprzedniego</strong> - pomiar TO STAN po dobie poprzedniej (= V z końca poprzedniej iteracji).</li><li><strong>Mylenie &quot;przepełnienie&quot; z &quot;wypuszczeniem 2%&quot;</strong> - to dwie różne operacje. Wypuszczenie nadmiaru tylko gdy &gt; 1 000 000.</li><li><strong>Granica <code>&gt;=</code> vs <code>&gt;</code></strong> - treść: &quot;więcej niż 1 000 000&quot; = <code>&gt; 1 000 000</code>. Pomiar równy 1 000 000 NIE jest przepełnieniem.</li><li><strong>Off-by-one przy liczbie dni</strong> - <code>&gt;=</code> 800 000 (&quot;co najmniej&quot;), nie <code>&gt;</code>.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Symulacja: O(N) gdzie N = 3653.</li><li>Pamięć: O(1) (zmienne, brak tablic).</li><li><strong>Łącznie: O(N) ≈ 3653 iteracji.</strong></li></ul>"}]}