# Informatyka — zadanie 5.1

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2018-05/zad/5.1
> 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ść

Zadanie 5. Zbiornik

Rzeka Wirka co roku wylewała. Aby temu zapobiec, wybudowano na rzece zbiornik retencyjny. W kolejnych wierszach pliku woda.txt znajdują się dane dotyczące dziennego dopływu wody z rzeki Wirki do zbiornika retencyjnego w kolejnych dniach z lat 2008-2017. Plik zawiera 3 653 wiersze. W każdym wierszu podane są dane: data (rrrr-mm-dd) oraz liczba metrów sześciennych wody, jaka dopływała do zbiornika w ciągu doby. Dane oddzielone są znakami tabulacji.

Przykład:
2008-01-01 | 2275
2008-01-02 | 2831
2008-01-03 | 4615
2008-01-04 | 4084
2008-01-05 | 3258

Podaj rok, w którym zbiornik retencyjny został zasilony łącznie największą liczbą metrów sześciennych wody z rzeki Wirki.

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

## Poprawna odpowiedź

**Rok 2015**

## Sposób 1 - agregacja po roku

**Idea:** dla każdej daty wyciągamy rok (pierwsze 4 znaki), sumujemy dopływy per rok, znajdujemy maksimum.

## Sposób 2 - Python

```python
from collections import defaultdict

sumy = defaultdict(int)
with open('woda.txt', encoding='utf-8') as f:
for linia in f:
cz = linia.strip().split('\t')
if len(cz) != 2:
continue
data, dop_str = cz
rok = data[:4]
sumy[rok] += int(dop_str)

najwiekszy = max(sumy.items(), key=lambda x: x[1])
print(f"Rok: {najwiekszy[0]}, suma = {najwiekszy[1]}") # 2015,

for rok, s in sorted(sumy.items()):
print(f"{rok}: {s}")

## Sposób 3 - SQL

```sql
SELECT
SUBSTRING(data, 1, 4) AS rok,
SUM(doplyw) AS suma
FROM woda
GROUP BY SUBSTRING(data, 1, 4)
ORDER BY suma DESC
LIMIT 1;

## Sposób 4 - arkusz kalkulacyjny

1. Otwórz woda.txt (separator: tabulacja).
2. Kolumna A: data, B: dopływ.
3. Kolumna C (pomocnicza): `=LEWY(A2; 4)` - rok jako string.
4. **Tabela przestawna**: wiersze = C (rok), wartości = SUMA B.
5. Sortuj malejąco - pierwszy wiersz to **2015** z najwyższą sumą.

Alternatywnie z formuły:
- F1:F10 - lata 2008 2017
- G1: `=SUMA.JEŻELI(C:C; F1; B:B)` - suma dla danego roku.
- Sortuj G malejąco lub `=INDEKS(F:F; PODAJ.POZYCJĘ(MAX(G:G); G:G; 0))` → 2015.

## Sposób 5 - C++ / Pascal

**C++:**
```cpp
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

int main() {
ifstream f("woda.txt");
map<string, long long> sumy;
string data, dopStr;
while (f >> data >> dopStr) {
string rok = data.substr(0, 4);
sumy[rok] += stoll(dopStr);
}
string maxRok;
long long maxSuma = 0;
for (auto& [r, s] : sumy) {
if (s > maxSuma) { maxSuma = s; maxRok = r; }
}
cout << "Rok: " << maxRok << " suma: " << maxSuma << endl;
return 0;
}

## Reference informatyczny - agregacja danych

> Reference - Wyciąganie roku z daty:
> - **Format ISO 8601** (rrrr-mm-dd): rok to pierwsze 4 znaki → `data[:4]` (Python), `LEFT(data, 4)` (SQL), `Copy(data, 1, 4)` (Pascal).
> - **W bazie danych** z typem DATE: `YEAR(data)` (MySQL) lub `EXTRACT(YEAR FROM data)` (PostgreSQL).
>
> Reference - defaultdict:
> - **Python**: `defaultdict(int)` automatycznie inicjalizuje 0 dla nowych kluczy.
> - **C++**: `std::map` z `operator[]` zachowuje się podobnie (auto-insert).
> - **Alternatywa**: `dict.get(rok, 0) + 1` lub `Counter`.
>
> Reference - Agregacja sumująca:
> - W SQL: `GROUP BY`. W Pythonie: słownik. W C++: map.
> - **Complexity**: O(N) z dobrym hash/tree.

## Schemat oceniania CKE

> Klucz CKE (zadanie 5.1, max 2 pkt):
> - **2 pkt** - odpowiedź **Rok 2015**
> - **0 pkt** - błędna lub brak
>
> **Uwaga: NIE PRZYZNAJE SIĘ 1 PUNKTU.**

## Typowe pułapki

- **Sortowanie alfabetyczne lat zamiast wg sumy** - wynik byłby "2008" jako pierwszy.
- **Pominięcie konwersji int** - w Python `int(dop_str)` konieczne, inaczej konkatenacja stringów.
- **Pomyłka separatora** - TAB (\t), nie spacja czy przecinek.
- **Pomyłka roku - wziąć ostatnie 4 cyfry zamiast pierwszych** - `data[-4:]` da dzień + miesiąc; powinno być `data[:4]`.
- **Brak EOL na końcu pliku** - większość parserów radzi sobie, ale uwaga w Pascal.

## Złożoność obliczeniowa

- Wczytanie 3653 wierszy: O(N).
- Agregacja: O(N) z O(1) na wstawienie do mapy.
- Znalezienie max: O(10) (10 lat).
- **Łącznie: O(N) ≈ 3653 operacji.**

## Linki

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

## Podobne zadania

- [Zadanie 5.4](https://matura.lol/question/informatyka-2025-czerwiec-matura-stara-rozszerzona-2/zad/5.4) — Zadanie 5.4. (0-3) Wykonaj zestawienie, w którym obliczysz całkowitą liczbę wizyt umówionych: • do godziny 11 włącznie • po godzinie 11 do 13 włącznie • po godz
- [Zadanie 4.1](https://matura.lol/question/informatyka-2020-lipiec-matura-rozszerzona-2/zad/4.1) — Zadanie 4.1. (0-3) Podaj identyfikatory (seria+numer) tych dokumentów z pliku identyfikator.txt, których suma cyfr z numerycznej części jest największa. Odpowie
- [Zadanie 4.2](https://matura.lol/question/informatyka-2024-czerwiec-matura-rozszerzona/zad/4.2) — Zadanie 4.2. (0-2) Dla danych zapisanych w pliku odbiorcy.txt podaj liczbę komputerów, które nie są odbiorcami żadnych pakietów. W przykładzie 1. jest jeden tak
- [Zadanie 8.1](https://matura.lol/question/informatyka-2024-czerwiec-matura-rozszerzona/zad/8.1) — Zadanie 8.1. (0-2) Dla każdej szczepionki podaj, ile łącznie jej dawek zostało podanych pacjentom. Jako wynik podaj listę zawierającą kod szczepionki i liczbę d

_Ostatnia aktualizacja danych: 2026-10-03_
