Opracowanie DZI: Dziewczynki

Transkrypt

Opracowanie DZI: Dziewczynki
Opracowanie DZI: Dziewczynki
Autor zadania: Jacek Tomasiewicz.
Rozwiązanie
Zadania rozwiązujemy wykorzystując sposób „gąsienicy”. W dwóch zmiennych trzymamy odpowiednio głowę
gąsienicy i jej tył. Niech koniec będzie jej tyłem, a początek jej głową. Początkowo obie zmienne ustawiamy na
pierwszej osobie w szeregu. Następnie początek przesuwamy tak długo w prawo, dopóki pomiędzy początkiem a końcem
nie będzie dokładnie K dziewczynek. Następnie koniec przesuwamy o jedno miejsce w prawo i ponownie początek
przesuwamy dopóki nie będzie K dziewczynek. Przypomina więc to ruch gąsienicy.
Przed każdym przesunięciem końca musimy obliczyć liczbę chłopców, którzy muszą usunąć się z szeregu i
wybrać z tych wartości minimum. Liczbę chłopców możemy w prosty sposób policzyć licząc różnicę:
początek - koniec + 1 - K, gdyż wiemy, że pomiędzy początkiem a końcem znajduje się dokładnie K dziewczynek, więc
resztę muszą stanowić chłopcy.
Pseudokod
1.
2.
3.
4.
5.
6.
wczytaj(n, k, t[])
poczatek := 1
koniec := 1
wynik := n + 1
/* patrzymy czy pierwszą osobą w szeregu jest dziewczynka */
if t[1] == 0 then
7.
dziewczynki := 1
8. else
9.
dziewczynki := 0
10. while koniec < n do
11.
while dziewczynki < k AND poczatek < n do
12.
poczatek := poczatek + 1
13.
/* jeśli natrafiliśmy na dziewczynkę */
14.
if t[poczatek] == 0 then dziewczynki := dziewczynki + 1
15.
if dziewczynki == k then wynik := min(wynik, poczatek – koniec + 1)
16.
/* jeśli przesuwamy koniec, to musimy zmniejszyć liczbę dziewczynek */
17.
if t[koniec] == 0 then dziewczynki := dziewczynki - 1
18.
koniec := koniec + 1
19. /* jeśli nie znaleziono żadnej możliwości */
20. if wynik == n + 1 then
21.
wypisz(NIE)
22. else
23.
wypisz(wynik - k)
Opracowanie DZI: Dziewczynki
1/1