# Informatyka — zadanie 5.2

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2018-05/zad/5.2
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2018 (rozszerzona)
- rok: 2018
- poziom: rozszerzona
- typ: open
- punkty: 2
- działy: Programowanie i algorytmika

## Treść

Kontekst - patrz zadanie 5.1.

Jaki był najdłuższy okres liczony w dniach, w którym codziennie dopływało do zbiornika retencyjnego co najmniej 10 000 metrów sześciennych wody z rzeki Wirki? Jest tylko jeden taki okres. Podaj datę początkową i datę końcową tego okresu.

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

**Okres: od 2015-03-17 do 2015-05-10**

**Długość: 55 dni**

## Sposób 1 - najdłuższa seria spełniająca warunek

**Idea:** to klasyczny problem **najdłuższy ciąg w tablicy spełniający warunek**.

Iterujemy po dniach:
- Jeśli `dopływ ≥ 10000` → zwiększ aktualny licznik serii, zapisz datę pierwszego dnia.
- Jeśli `dopływ < 10000` → reset licznika.
- Po każdym dniu sprawdź, czy aktualna seria jest najdłuższa; jeśli tak, zapisz daty.

## Sposób 2 - Python

```python
linie = []
with open('woda.txt', encoding='utf-8') as f:
for linia in f:
cz = linia.strip().split('\t')
if len(cz) == 2:
data, dop = cz
linie.append((data, int(dop)))

max_dlugosc = 0
max_start = ''
max_koniec = ''

akt_dlugosc = 0
akt_start = ''
akt_koniec = ''

for data, dop in linie:
if dop >= 10000:
if akt_dlugosc == 0:
akt_start = data
akt_dlugosc += 1
akt_koniec = data
if akt_dlugosc > max_dlugosc:
max_dlugosc = akt_dlugosc
max_start = akt_start
max_koniec = akt_koniec
else:
akt_dlugosc = 0

print(f"Od {max_start} do {max_koniec}, długość: {max_dlugosc} dni")
# Od 2015-03-17 do 2015-05-10, długość: 55 dni

## Sposób 3 - arkusz kalkulacyjny

1. Kolumny A (data), B (dopływ).
2. Kolumna C: `=JEŻELI(B2>=10000; 1; 0)` - wskaźnik 1/0.
3. Kolumna D (kumulatywna seria): D1=C1; D2=`=JEŻELI(C2=1; D1+1; 0)` - rośnie gdy spełnione, resetuje gdy nie.
4. Znajdź max D: `=MAX(D:D)` → 55.
5. Znajdź wiersz: `=PODAJ.POZYCJĘ(55; D:D; 0)` → numer wiersza końca serii (data końcowa = A[ten wiersz]).
6. Data początkowa = data końcowa minus 54 dni (lub o pozycję A[wiersz_końca - 54]).

## Sposób 4 - C++

```cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
ifstream f("woda.txt");
string data, dopStr, prevData = "", aktStart = "";
int dop, aktDl = 0, maxDl = 0;
string maxStart = "", maxKoniec = "";
while (f >> data >> dopStr) {
dop = stoi(dopStr);
if (dop >= 10000) {
if (aktDl == 0) aktStart = data;
aktDl++;
if (aktDl > maxDl) {
maxDl = aktDl;
maxStart = aktStart;
maxKoniec = data;
}
} else {
aktDl = 0;
}
}
cout << "Od " << maxStart << " do " << maxKoniec << " (" << maxDl << " dni)" << endl;
return 0;
}

## Reference informatyczny - najdłuższy podciąg spełniający warunek

> Reference - Klasyczne zadania na ciągach:
> - **Najdłuższy podciąg jedynek** (np. "010111110001" → 5).
> - **Najdłuższa seria niemalejąca** w tablicy.
> - **Najdłuższa seria z warunkiem** P(x) - uogólnienie.
>
> Reference - Algorytm "running streak":
> - Single-pass O(n).
> - 2 zmienne: `akt` (aktualna długość), `max` (najdłuższa do tej pory).
> - Reset `akt = 0` gdy warunek nie spełniony.
> - Aktualizacja `max = max(max, akt)`.
>
> Reference - Daty:
> - W stringach format ISO (rrrr-mm-dd) zachowuje porządek leksykograficzny == chronologiczny.
> - Można porównywać daty jako stringi bez konwersji.
> - Daty są ciągłe w pliku (codziennie od 2008-01-01 do 2017-12-31).

## Schemat oceniania CKE

> Klucz CKE (zadanie 5.2, max 2 pkt):
> - **2 pkt** - obie daty prawidłowe (2015-03-17 i 2015-05-10)
> - **1 pkt** - tylko jedna data ALBO tylko liczba dni (55)
> - **0 pkt** - błędna lub brak

## Typowe pułapki

- **"Co najmniej 10000"** = `>= 10000`, NIE `> 10000`. Pominięcie wartości równej 10000.
- **Brak resetowania licznika** - wynik byłby kumulatywny i bezsensowny.
- **Pomyłka daty początkowej** - łatwo zapomnieć zapisać `akt_start` w momencie startu serii.
- **Liczenie dni - `koniec - start + 1`** w datach, nie `koniec - start`.
- **Konwersja int** - `int(dop_str)` w Python, bo bez tego porównanie string < string.
- **Iteracja w niesortowanym pliku** - plik jest już chronologicznie (data rosnąco), więc iterujemy w kolejności.

## Złożoność obliczeniowa

- Single-pass: **O(N)** = O(3653).
- Pamięć: O(1) dodatkowa.

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2018-05/zad/5.2)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2018-05%2Fzad%2F5.2)

## Podobne zadania

- [Zadanie 2](https://matura.lol/question/informatyka-2007-maj-matura-rozszerzona/zad/2) — Zadanie 2. (19 pkt) Zgodnie z regułami gry w szachy, hetman (królowa) może atakować figury ustawione na polach w kolumnie, wierszu oraz dwóch przekątnych przech
- [Zadanie 2](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/2) — Zadanie 2. Zapis symboliczny W pliku symbole.txt zapisano 2000 napisów. Każdy z nich jest zapisany w osobnym wierszu i składa się z dokładnie 12 znaków spośród:
- [Zadanie 3](https://matura.lol/question/informatyka-2007-maj-matura-rozszerzona/zad/3) — Zadanie 3. (11 pkt) W tabeli podany jest algorytm, który pozwala obliczyć wartość pewnej sumy dla danej dodatniej liczby całkowitej n. 3.1. Podaj, jaką wartość 
- [Zadanie 7](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/7) — Zadanie 7. Poszukiwanie wody na Marsie W trzech plikach tekstowych o nazwach laziki.txt, obszary.txt, pomiary.txt zapisano informacje zawierające dane o poszuki

_Ostatnia aktualizacja danych: 2026-10-03_
