Misja pierwsza: Ćwicz i zwyciężaj
Zadanie 1. Najdłuższy spójny podciąg niemalejący
Karol jest naukowcem w Republice Kernelowej. W ostatnim czasie przeprowadzał badania na temat stężenia pyłów przemysłowych w powietrzu. W tym celu w stolicy kraju zbudował stację pomiarową. Po kilku miesiącach pomiarów zestawił swoje wyniki w pliku pomiary.txt.
Plik pomiary.txt składa się ze wierszy. W każdym z nich zapisano jedną liczbę naturalną.
Pewnego dnia Karol został poproszony przez urzędników o podanie najdłuższego ciągu stężeń pyłów z dni, w których zanieczyszczenie bez przerwy utrzymywało się na tym samym poziomie lub rosło. Jeśli był więcej niż jeden taki okres, wszystkie powinny być wypisane w kolejnych liniach.
Przykładowe dane:
Wynik:
Napisz program, który znajdzie najdłuższy spójny podciąg niemalejącynajdłuższy spójny podciąg niemalejący dla danych z pliku pomiary.txt, a wynik zapisze do pliku powietrze.txt.
Do oceny oddajesz:
plik
powietrze.txtz odpowiedzią (liczby wchodzące w skład najdłuższego spójnego niemalejącego podciągu liczb całkowitych dodatnich z plikupomiary.txt; każdy podciąg w osobnej linii; linie powinny być oddzielone pojedynczym znakiem odstępu)plik(i) z komputerową realizacją zadania
Przedstaw rozwiązanie zadania, pisząc program w języku C++, Java lub Python.
Rozwiązanie
Rozwiązanie zadania przedstawimy w postaci pseudokodu, ponieważ na egzaminie maturalnym można korzystać z wybranego języka programowania: C++, Java lub Python.
Rozwiązanie podzielimy na dwa etapy. W pierwszej część określamy długość najdłuższego niemalejącego podciągu oraz indeksy tablicy, między którymi się on znajduje. Następnie, znając położenie podciągu, możemy przekopiować jego elementy do tablicy wynikowej. Na początku wczytajmy dane z zadania. Tablice indeksujemy od zera, zgodnie z zasadami indeksowania przyjętymi w językach programowania dostępnych na maturze:
W celu znalezienia położenia spójnego, niemalejącego podciągu definiujemy trzy dodatkowe zmienne: maxDlugosc, obecnaDlugosc oraz pustą tablicę poczatkiPodciagow, która będzie przechowywać indeksy początkowe wszystkich najdłuższych podciągów niemalejących.
Następnie przechodzimy po wszystkich elementach tablicy pomiary oprócz pierwszego. Jeśli element o wartości indeksu o jeden mniejszej od wartości indeksu analizowanego elementu jest mniejszy lub równy, inkrementujemy zmienną obecnaDlugosc.
Jeżeli element o wartości indeksu o jeden mniejszej od wartości indeksu analizowanego elementu jest większy, oznacza to koniec niemalejącego spójnego podciągu i rozpoczęcie zliczania na nowo — ustawiamy wartość zmiennej obecnaDlugosc na 1.
Jeśli wartość zmiennej obecnaDlugosc jest większa od maxDlugosc, aktualizujemy wartość maxDlugosc oraz czyścimy zawartość tablicy poczatkiPodciagow poprzez przypisanie jej pustej tablicy, a następnie dodajemy do tablicy poczatkiPodciagow wartość i - maxDlugosc + 1 jako początek najdłuższego niemalejącego podciągu (jesteśmy w stanie wyliczyć początek podciągu, znając obecny indeks tablicy oraz wartość maxDlugosc).
Jeśli długość obecnego podciągu niemalejącego zapisana w zmiennej obecnaDlugosc jest równa długości dotychczasowego najdłuższego podciągu zapisanego w zmiennej maxDlugosc, dodajemy wartość i - maxDlugosc + 1 do tablicy poczatkiPodciagow.
W kolejnym kroku w pętli dla pobieramy początki podciągów z tablicy poczatkiPodciagow i wypisujemy elementy tablicy pomiary od indeksu poczatekPodciagu do poczatekPodciagu + maxDlugosc - 1.
Następnie zapisujemy wartość elementu tablicy pomiary[j] do pliku powietrze.txt. W dalszej kolejności dodajemy nową linię do pliku, aby oddzielić od siebie podciągi.
Zamykamy pliki.
Odpowiedź do zadania
powietrze.txt
Słownik
fragment ciągu składający się z elementów ułożonych bezpośrednio po sobie, w kolejności niemalejącej, czyli w ten sposób, że każdy kolejny element jest równy poprzedniemu bądź większy od niego