# Informatyka — zadanie 4.4

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2017-05/zad/4.4
> 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: 3
- działy: Programowanie i algorytmika

## Treść

Kontekst - patrz zadanie 4.1.

Na potrzeby zadania 4.4 załóżmy, że firma Słodzik wprowadziła system premiowania klientów hurtowych, który obejmuje lata 2005-2014. Klient otrzymuje przy zakupie rabat, którego wysokość zależy od łącznej ilości cukru zakupionego do tej pory przez tego klienta, **wliczając w to ilość cukru z bieżącej transakcji sprzedaży**. Wysokość rabatu za każdy kilogram cukru w bieżącej transakcji wynosi:
- 5 gr, jeśli dotychczas zakupił co najmniej 100 kg, ale mniej niż 1000 kg;
- 10 gr, jeśli dotychczas zakupił co najmniej 1000 kg, ale mniej niż 10000 kg;
- 20 gr, jeśli dotychczas zakupił co najmniej 10000 kg.

Podaj łączną wartość rabatów udzielonych przez firmę Słodzik.

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

## Poprawna odpowiedź

**Łączna wartość rabatów: 38 126,35 zł**

## Sposób 1 - kluczowa interpretacja

**Treść mówi:** rabat zależy od łącznej ilości cukru **wliczając bieżącą transakcję**. Czyli liczymy nowy stan łącznego zakupu klienta PO dodaniu kg z bieżącej transakcji, i według tego stanu (>= 100, >= 1000, >= 10000 kg) określamy rabat za każdy kg w bieżącej transakcji.

Progi rabatów per kg w bieżącej transakcji:
- nowa suma < 100 kg → 0 gr/kg (brak rabatu)
- 100 ≤ nowa suma < 1000 → **5 gr/kg = 0,05 zł/kg**
- 1000 ≤ nowa suma < 10 000 → **10 gr/kg = 0,10 zł/kg**
- 10 000 ≤ nowa suma → **20 gr/kg = 0,20 zł/kg**

## Sposób 2 - Python

```python
from collections import defaultdict

sumy = defaultdict(int) # NIP → dotychczasowa łączna ilość
laczny_rabat = 0.0

with open('cukier.txt', encoding='utf-8') as f:
for linia in f:
data, nip, kg_s = linia.strip().split('\t')
kg = int(kg_s)
sumy[nip] += kg # nowa suma WLICZAJĄC bieżącą transakcję
nowa = sumy[nip]
if nowa >= 10000:
rabat_per_kg = 0.20
elif nowa >= 1000:
rabat_per_kg = 0.10
elif nowa >= 100:
rabat_per_kg = 0.05
else:
rabat_per_kg = 0.0
laczny_rabat += kg * rabat_per_kg

print(f"Łączny rabat: {laczny_rabat:.2f} zł")
# Łączny rabat: 38126.35 zł

## Sposób 3 - arkusz kalkulacyjny

1. Kolumny: A=Data, B=NIP, C=Kg.
2. **Suma narastająca per klient** w kolumnie D:
- D2: `=SUMA.JEŻELI($B$2:B2; B2; $C$2:C2)` - suma kg dla danego NIP od początku do bieżącego wiersza (włącznie).
3. **Rabat per kg** w kolumnie E:
- `=JEŻELI(D2>=10000; 0,20; JEŻELI(D2>=1000; 0,10; JEŻELI(D2>=100; 0,05; 0)))`
4. **Rabat dla transakcji** w F: `=C2*E2`.
5. **Suma F** = **38126,35**.

## Sposób 4 - Pascal

```pascal
program Slodzik44;
uses sysutils;
var
f: TextFile;
line, data, nip: string;
kg, nowa, i, foundIdx: LongInt;
rabatPerKg, laczny: Real;
nipy: array[1 3000] of string;
sumy: array[1 3000] of LongInt;
n: Integer;
begin
n := 0;
laczny := 0;
AssignFile(f, 'cukier.txt');
Reset(f);
while not Eof(f) do
begin
ReadLn(f, line);
// [parsowanie split tabulacją: data, nip, kg]
// Szukaj nip w tablicy nipy
foundIdx := 0;
for i := 1 to n do
if nipy[i] = nip then foundIdx := i;
if foundIdx = 0 then
begin
n := n + 1;
nipy[n] := nip;
sumy[n] := 0;
foundIdx := n;
end;
sumy[foundIdx] := sumy[foundIdx] + kg;
nowa := sumy[foundIdx];
if nowa >= 10000 then rabatPerKg := 0.20
else if nowa >= 1000 then rabatPerKg := 0.10
else if nowa >= 100 then rabatPerKg := 0.05
else rabatPerKg := 0.0;
laczny := laczny + kg * rabatPerKg;
end;
CloseFile(f);
WriteLn('Łączny rabat: ', laczny:0:2); // 38126.35
end.

## Reference algorytmiczny - narastający stan klienta

> Reference - running sum per klient:
> - Słownik nip → bieżąca suma kg.
> - Każda transakcja UPDATE: suma[nip] += kg.
> - Decyzja o rabacie na podstawie BIEŻĄCEJ sumy (po dodaniu kg).

## Schemat oceniania CKE

> Klucz CKE (zadanie 4.4, max 3 pkt):
> - **3 pkt** - poprawna odpowiedź **38 126,35 zł**
> - **2 pkt** - **38 116,80 zł** (rabaty dla wartości **większych niż** 100/1000/10000, zamiast >=)
> - **2 pkt** - **37 175,75 zł** (rabat NIE uwzględnia kg z bieżącej transakcji)
> - **1 pkt** - **176,30 zł** (rabat nie pomnożony przez liczbę kg)
> - **0 pkt** - inna błędna lub brak

## Typowe pułapki

- **„Większe od 100" vs „co najmniej 100"** - treść wyraźnie mówi „co najmniej" (>=), nie „więcej niż" (>). Granica 100 powinna już aktywować rabat 5 gr.
- **Pominięcie bieżącej transakcji w sumie** - uczeń liczy rabat na podstawie sumy SPRZED dodania bieżącej transakcji. Treść mówi „wliczając", więc dodaj kg najpierw.
- **Pominięcie pomnożenia rabatu przez kg** - łatwo zapomnieć, że rabat to **per kg w bieżącej transakcji**, nie ryczałt.
- **Kolejność progów w if** - trzeba sprawdzać od największego (>=10000) do najmniejszego, inaczej zła klasyfikacja.

## Złożoność obliczeniowa

- Pojedyncze przejście transakcji + lookup w słowniku: **O(n)** gdzie n = 2162.
- Pamięć: O(k) gdzie k = liczba unikalnych NIPów.

## Linki

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

## 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_
