# Informatyka — zadanie 4.5

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

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

## Treść

Zadanie 4.5. (0-4)
Firma Słodzik chce, aby w magazynie na początku każdego miesiąca znajdowało się nie mniej
niż 5000 kg cukru. Po podsumowaniu miesięcznej sprzedaży uzupełnia stan magazynu:
zakupuje towar u producenta. Producent sprzedaje cukier w paletach po 1000 kg. Nie można
zakupić niepełnej palety. Firma Słodzik kupuje tylko tyle palet, żeby uzupełnić stan do co
najmniej 5000 kg. Zakup towaru u producenta odbywa się ostatniego dnia miesiąca przed
północą.
W dniu 2005-01-01, przed rozpoczęciem sprzedaży, w magazynie znajdowało się 5000 kg
cukru. Podaj, ile razy na koniec miesiąca (już po ostatniej sprzedaży w tym miesiącu) firma
Słodzik w latach 2005-2014 dokupywała co najmniej 4000 kg cukru.
Uwaga: bywają dni, gdy nie jest zawierana żadna transakcja sprzedaży, bywają też dni, gdy
transakcji jest więcej niż jedna.
Do oceny oddajesz:
• plik tekstowy wyniki4.txt zawierający odpowiedzi do poszczególnych zadań,
odpowiedź do każdego zadania powinna być poprzedzona jego numerem
• plik zawierający wykres do zadania 4.3 o nazwie:
• plik(i) zawierający(e) komputerową realizację Twoich obliczeń o nazwie(ach):
Wypełnia
egzaminator
Nr zadania
4.1.
4.2.
4.3.
4.4.
4.5.
Maks. liczba pkt.
1
2
3
3
4
Uzyskana liczba pkt.
MIN_2R

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

## Poprawna odpowiedź

**14 razy**

## Sposób 1 - symulacja stanu magazynu (Python)

```python
from collections import defaultdict
import math

# Agreguj sprzedaż miesięczną
sprzedaz_msc = defaultdict(int)
with open('cukier.txt', encoding='utf-8') as f:
for linia in f:
data, nip, kg = linia.strip().split('\t')
klucz = data[:7] # 'rrrr-mm'
sprzedaz_msc[klucz] += int(kg)

stan = 5000 # początkowy stan na 2005-01-01
liczba_duzych_zakupow = 0
zakupy = []

for msc in sorted(sprzedaz_msc.keys()):
sprzedano = sprzedaz_msc[msc]
stan -= sprzedano # stan po ostatniej sprzedaży miesiąca
# Zakup pełnych palet, aby uzupełnić do >= 5000
if stan < 5000:
brakuje = 5000 - stan
palet = math.ceil(brakuje / 1000) # tyle palet, żeby było >=5000
zakup_kg = palet * 1000
if zakup_kg >= 4000:
liczba_duzych_zakupow += 1
stan += zakup_kg

print("Liczba zakupów >= 4000 kg:", liczba_duzych_zakupow)
# Liczba zakupów >= 4000 kg: 14

## Sposób 2 - analiza logiki

**Stan na początku miesiąca:** S₀ ≥ 5000 (po zakupie na koniec poprzedniego miesiąca).
**Sprzedaż w miesiącu:** S_sprzedaz.
**Stan po ostatniej sprzedaży:** S₁ = S₀ - S_sprzedaz.

**Jeśli S₁ ≥ 5000:** firma NIE dokupuje (nie potrzebuje).
**Jeśli S₁ < 5000:** brakuje = 5000 - S₁ kg. Kupuje palety: ⌈brakuje/1000⌉ * 1000 kg.

Liczba palet ≥ 4: brakuje > 3000, więc S₁ < 2000. Czyli sprzedaż w miesiącu > S₀ - 2000.

**Specjalny przypadek - sierpień 2010**: jeśli stan po sprzedaży miesiąca wciąż ≥ 5000 (sprzedaż mała), firma NIE kupuje wcale w tym miesiącu - stan po zakupie ≠ 5000+ (zostaje ten sam stan, więc nie wpada do liczników). To źródło typowej pomyłki dającej 15 zamiast 14.

## Sposób 3 - Pascal (zarys)

```pascal
program Slodzik45;
var
f: TextFile;
line, data, nip, mscPrev: string;
kg, stan, sprzedanoMsc, liczbaZakupow, brakuje, palet, zakupKg: LongInt;
msc: string;
begin
stan := 5000;
liczbaZakupow := 0;
mscPrev := '';
sprzedanoMsc := 0;
AssignFile(f, 'cukier.txt');
Reset(f);
while not Eof(f) do
begin
ReadLn(f, line);
msc := Copy(line, 1, 7); // 'rrrr-mm'
// parsuj kg
if (mscPrev <> '') and (msc <> mscPrev) then
begin
// zamknij poprzedni miesiąc
stan := stan - sprzedanoMsc;
if stan < 5000 then
begin
brakuje := 5000 - stan;
palet := (brakuje + 999) div 1000;
zakupKg := palet * 1000;
if zakupKg >= 4000 then liczbaZakupow := liczbaZakupow + 1;
stan := stan + zakupKg;
end;
sprzedanoMsc := 0;
end;
sprzedanoMsc := sprzedanoMsc + kg;
mscPrev := msc;
end;
CloseFile(f);
// zamknij ostatni miesiąc
stan := stan - sprzedanoMsc;
if stan < 5000 then
begin
brakuje := 5000 - stan;
palet := (brakuje + 999) div 1000;
zakupKg := palet * 1000;
if zakupKg >= 4000 then liczbaZakupow := liczbaZakupow + 1;
end;
WriteLn(liczbaZakupow); // 14
end.

## Reference algorytmiczny - symulacja stanu z zaokrąglaniem

> Reference - Zaokrąglanie w górę do pełnych jednostek:
> - `ceil(a / b)` w Pythonie z math.ceil lub `(a + b - 1) // b` całkowicie.
> - W Pascal: `(a + b - 1) div b`.
> - W arkuszu: `ZAOKR.GÓRA(a/b; 1)`.

## Schemat oceniania CKE

> Klucz CKE (zadanie 4.5, max 4 pkt):
> - **4 pkt** - odpowiedź **14**
> - **3 pkt** - **13** (liczenie zakupu pierwszego dnia miesiąca zamiast ostatniego)
> - **2 pkt** - **4** (warunek >4000 zamiast >=4000)
> - **2 pkt** - **5** (nie uwzględniono zakupu pełnych palet - brakuje >=4000 kg)
> - **2 pkt** - **15** (nieuwzględnienie miesiąca sierpień 2010, gdzie sprzedaż nie zmniejszyła stanu < 5000)
> - **0 pkt** - inna błędna lub brak. **Uwaga: nie przyznaje się 1 pkt.**

## Typowe pułapki

- **Sierpień 2010 (kluczowa pułapka, wynik 15)** - sprzedaż w sierpniu 2010 jest na tyle mała, że stan magazynu po ostatniej sprzedaży miesiąca jest wciąż ≥ 5000. Firma NIE dokupuje wtedy nic, ale niektórzy uczniowie liczą pusty zakup jako 0 i potem nie sprawdzają warunku, dodając „fantomowe" zakupy.
- **>=4000 vs >4000** - treść wyraźnie „co najmniej 4000", czyli >=4000. Zakup dokładnie 4000 kg liczy się.
- **Zaokrąglanie palet w górę** - nie można kupić ułamka palety; brakuje 3001 kg → 4 palety = 4000 kg.
- **Pierwszy stan magazynu** - 2005-01-01 początkowo 5000 kg, a sprzedaż styczniowa redukuje stan.

## Złożoność obliczeniowa

- Agregacja transakcji per miesiąc: **O(n)** gdzie n = 2162.
- Pętla po miesiącach (120 miesięcy 2005-2014): **O(120)** = stała.
- Łączna złożoność: **O(n)**.

## Linki

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

## Podobne zadania

- [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 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
- [Zadanie 3](https://matura.lol/question/informatyka-2023-maj-matura-rozszerzona/zad/3) — Zadanie 3. Liczba Pi Pewien matematyk jest zafascynowany liczbą π ≈ 3,14159265 do tego stopnia, że zapisał jej rozwinięcie dziesiętne z dokładnością do 10 000 c
- [Zadanie 3](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/3) — Zadanie 3. Dron Tor lotu pewnego drona składa się z prostych odcinków. Lot rozpoczyna się w punkcie (0, 0), a kończy w punkcie (20000, 0). Dron poza startem i l

_Ostatnia aktualizacja danych: 2026-10-03_
