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