Tak z czystej ciekawości wpisałem treść tego zadania w google (myślałem, że to może zaliczenie...), no ale wyszło mi, że to z zeszłorocznej próbnej matury. Ale przy okazji trafiłem na inny wpis na temat algorytmów autora/autorki tego wątku:
24godzina napisał(a)
Witam, mam mały problem, nie rozumiem paru rzeczy. Jestem laikiem. Na początku do czego służy w algorytmach i w C++ literka i, j, oraz tab[10] Proszę o takie jak najprostsze wytłumaczenie. Co oznacza np. i=i+1
Może spróbuj jednak od jakiegoś prostego kursu, od samych podstaw. Bez tego jakiekolwiek próby zrozumienia/stworzenia jakiegoś algorytnu skończą się fiaskiem.
Ale ok, ad rem... Tak w uproszczeniu, algorytm (wszystko jedno czy w postaci słownej czy graficznej) to przepis, dokładny sposób postępowania, żeby osiągnąć jakiś cel, zrobić jakieś obliczenia itp. Dokładny, na tyle, żeby można było niemyślącemu komputerowi wytłumaczyć "jak to ma zrobić" - przecież on nie zna i nie rozumie treści zadania.
24godzina napisał(a)
- Ciag musi składać się z co najmniej dwóch liczb. 2. Druga liczba nie może być większa od pierwszej 3. Znajdz takie liczby 4. Zakoncz
To powyżej to w żadnym przypadku nie jest sposób postępowania, żeby znaleźć rozwiązanie :(
jak w łatwy sposób nauczyć się programowania? i algorytmiki?
No cóż... Pisać, rozwiązywać zadania, brać się za następne... Wiedzieć co się robi... Ok, nie dam Ci rozwiązania tego zadania, ale pokażę jak sobie możesz część rozpisać - może się przyda, żeby kontynuować. Ot, taki przypływ dobrego serca i dobrego humoru dzisiaj ;)
Masz dany ciąg, np. 2, 2, 2, 3, 1, 1, 3, 11, 7, 7, 6, 7, 7, 9, 9, 7
- równie dobrze możesz go nazwać tablicą, listą. Po prostu kolejne elementy ustawione w szereg, po którym się możesz poruszać. Możesz pobrać wartość elementu na pozycji 4, możesz wskazać na kolejny element po pobranym itp., prawda? Mam nadzieję, że przynajmniej pojęcie tablicy jest Ci znane...
Jeśli chciałbym znaleźć wszystkie podciągi (kawałki tablicy, listy) w takim ciągu spełniające warunki: podciąg złożony z przynajmniej dwóch liczb, w którym kolejna liczba nie jest większa od poprzedniej i tego ciągu nie można rozszerzyć do innych schodów w dół w jedną albo w drugą stronę
mogę to zrobić np. tak w punktach:
//---> Start
0. Mam dany ciąg:
dane = 2, 2, 2, 3, 1, 1, 3, 11, 7, 7, 6, 7, 7, 9, 9, 7
, tak że np. zapis dane[1]
wyciągnie mi z tego ciągu liczbę 2
, zapis dane[5]
wyciągnie mi z tego ciągu liczbę 1
1. Tworzę sobie zmienne pomocnicze (będę z nich korzystał w trakcie, będę w nich zapisywał wyniki):
pos
-> będzie mi wskazywało na aktualny (badany element ciągu)
tab
-> tablica, w której będę zapisywał kolejne elementy ciągu spełniające powyższe warunki
res
-> tablica, w której będę zapisywał znalezione podciągi (małe tablice) tab, które spełniają warunki zadania
2. Ustawiam początkowe wartości tych zmiennych:
pos = 1
- wskazuje na drugi element ciągu (to tak dla jasności w tej chwili, zazwyczaj elementy w tablicach indeksuje się od zera, tak że pierwszy element będzie miał indeks = 0
tab += dane[0]
do pustej tablicy tab
dodaję pierwszy element ciągu (coś na początek, bo od tego momentu będę sobie sprawdzał czy kolejne są mniejsze bądz równe)
3. sprawdzam czy ostatni element dodany do tablicy tab
jest większy lub równy elementowi na który wskazuje dane[pos]
A. jeśli tak:
to ten element dane[pos]
dodaję na końcu tablicy tab
B. jeśli nie (to oznacza, że koniec schodków):
- sprawdzam, czy ilość elementów dopisywanych do tablicy tab
jest większa od 1 (podciąg musi mieć co najmiej dwa elementy)
a: jeśli tak, to zapisuję tablicę tab
jako element tablicy res
(to jedne "schodki")
- czyszczę tablicę `tab` (przygotowuję do szukania następnych schodków)
- jako pierwszy element wyczyszczonej tablicy tab wstawiam `dane[pos]` (Nie spełniał warunku należenia do schodków, ale może będzie początkiem kolejnych)
4. Zwiększam zmienną pos
o jeden, tak żeby wskazywała kolejny element ciągu dane
5. Idę do punktu 3
//---> Stop
Notka: to jest tylko taki prymitywny algorytm wyszukiwania podciągów spełniających podane warunki w danym ciągu, nie uwzględnia np. działania w przypadku dojścia do końca badanego ciągu (to trzeba sobie dopisać w jakich warunkach zakończyć pracę ;) )
Ot, chciałem tylko pokazać, jak sobie podejść do problemu, jak go rozpisać. Nie daję gotowców, ale możesz to uznać za wskazówkę "jak się do tego zabrać" :] Mając rozpisany problem w punktach można go sobie spokojnie przenieść już do postaci graficznego algorytmu (albo jakiegokolwiek języka programowania).
Mam nadzieję, że gdzieś się nie walnąłem przy rozpisce :]