Nauczycielka w przedszkolu chce rozdać ciastka dzieciom w swojej grupie. Dzieci siedzą w linii obok siebie (i nie zmieniąją tych pozycji). Każde dziecko ma przypisaną ocenę Si, gdzie i należy do przedziału (1, 2, ..., n) zgodnie z wynikiem testu umiejetności. Nauczycielka chce dać każdemu dziecki co najmniej jedno ciestko. Jeśli dzieci siedzą obok siebie, dziecko z wyższą oceną musi dostać więcej ciastek niż z niższą oceną. Nauczycielka ma ograniczony budżet, więc chce rozdać jak najmniej ciastek. Zaproponuj algorytm, który zwróci najmniejszą liczbę ciastek, które musi rozdać nauczycielka.
Algorytm zakłada, że na początku zostanie utworzona kolekcja, w której będą przechowane indeksy uczniów, dla których nie można było wyznaczyć liczby ciastek bez znajomości liczby ciastek następnego ucznia. Istnieje tablica, w której przechowywana jest liczba ciastek przyporządkowana danemu uczniowi. Przeglądamy od początku oceny kolejnych uczniów i na ich podstawie przypisujemy kolejnym uczniom liczbę ciastek jeśli jest to możliwe.
- Jeśli rozpatrujemy pierwszego ucznia i ma on ocenę mniejszą lub równą kolejnemu uczniowi to jego liczba ciastek wynosi: 1.
- Jeśli rozpatrujemy ostatniego ucznia i ma on ocenę większą od przedostatniego ucznia to jego liczba ciastek wynosi: liczba ciastek przedostatniego ucznia + 1.
- Jeśli ocena ucznia jest mniejsza od ocen obu sąsiadów to liczba ciastek wynosi: 1.
- Jeśli ocena ucznia jest większa od poprzednika i niewiększa od następnika to liczba ciastek wynosi: liczba ciastek poprzednika + 1.
Przypisanie nie będzie możliwe w następujących przypadkach:
- Rozważamy pierwszego ucznia i ma on większą ocenę niż drugi uczeń.
- Rozważamy ucznia mającego poprzednika i następnika.
- Uczeń ma większą ocenę niż poprzednik i większa ocenę niż następnik.
- Uczeń ma mniejszą ocenę niż poprzednik i większą ocenę niż następnik.
Następnie rozważamy uczniów, dla których nie zostały przydzielone ciastka – ich indeksy są przechowywane w kolekcji. Przeglądamy kolekcję od końca (uczeń z największym indeksem na początku).
- Jeśli indeks jest równy 0 (pierwszy uczeń) to przypisujemy mu ilość ciastek równą: ilości ciastek następnego dziecka + 1.
- Dla ucznia z oceną większą od sąsiadów przypisujemy liczbę ciastek równą: MAX z liczby ciastek sąsiadów + 1.
- Dla ucznia z oceną mniejsza niż poprzednik i większą niż następnik przypisujemy liczbę ciastek równą: liczba ciastek następnika + 1.
Są trzy tryby wykonania definiowane poprzez parametr uruchomieniowy -m
. Parametr może przjmować wartość 1, 2 lub 3. Poniżej opisane są kolejne tryby wykonania z liczą porządkową związaną z tym trybem wykonania.
W tym trybie dane problemu (oceny kolejnych uczniów) pobierane są ze standardowego strumienia wejścia.
Dane powinny być w formacie: 1, 2, 5, 4, 6
.
$ java -jar ./Cookies.jar -m 1 < sample_data.txt > result.txt
W tym trybie wykonania program sam generuje problem o zdefiniowanej przez paramter -n
wielkości a następnie go rozwiązuje.
$ java -jar ./Cookies.jar -m 2 -n 6
Tryb wykonania, który służy do testowania wraz z pomiarem czasu. Dane testowe są definiowane przez następujące parametry:
-n
początkowa wielkość problemu-k
liczba testowanych wielkości problemu-step
krok, czyli wartość o jaką zwiększa się rozmiar kolejnych testowanych wielkości problemów-r
ilość badanych instancji danej wielkości problemu
$ java -jar ./Cookies.jar -m 3 -n 600000 -k 30 -step 5000 -r 50 > result.txt