Wstęp do programowania / Ćwiczenia 2: Różnice pomiędzy wersjami
(Nie pokazano 14 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 325: | Linia 325: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Linia 365: | Linia 366: | ||
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0. | Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Najprostsze rozwiązanie to dla wszystkich możliwych segmentów policzyć ich sumę. | Najprostsze rozwiązanie to dla wszystkich możliwych segmentów policzyć ich sumę. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' SegmentOMaksymalnejSumie1(N:integer; A:array[1..N] of integer); | '''program''' SegmentOMaksymalnejSumie1(N:integer; A:array[1..N] of integer); | ||
'''var''' l,p,j,suma,maks: integer; | '''var''' l,p,j,suma,maks: integer; | ||
Linia 390: | Linia 395: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
W powyższym rozwiązaniu sumę pewnych segmentów liczy się wiele razy. Lepiej dla danego początku l obliczać po kolei sumy coraz dłuższych segmentów zaczynających sie w l. | W powyższym rozwiązaniu sumę pewnych segmentów liczy się wiele razy. Lepiej dla danego początku l obliczać po kolei sumy coraz dłuższych segmentów zaczynających sie w l. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' SegmentOMaksymalnejSumie2(N:integer; A:array[1..N] of integer); | '''program''' SegmentOMaksymalnejSumie2(N:integer; A:array[1..N] of integer); | ||
'''var''' l,p,suma, maks: integer; | '''var''' l,p,suma, maks: integer; | ||
Linia 417: | Linia 426: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 3</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Niech Pref(i) oznacza sumę elemetów tablicy od 1 do i włącznie. Suma segmentu od l do p to oczywiście Pref(p) - Pref(l-1). Maksymalną sumę segmentu kończącego się w p uzyskamy odejmując od Pref(p) minimalne Pref(i) gdzie i przebiega [1..p]. | Niech Pref(i) oznacza sumę elemetów tablicy od 1 do i włącznie. Suma segmentu od l do p to oczywiście Pref(p) - Pref(l-1). Maksymalną sumę segmentu kończącego się w p uzyskamy odejmując od Pref(p) minimalne Pref(i) gdzie i przebiega [1..p]. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 3</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' SegmentOMaksymalnejSumie3(N:integer; A:array[1..N] of integer); | '''program''' SegmentOMaksymalnejSumie3(N:integer; A:array[1..N] of integer); | ||
'''var''' mini_pref,biez_pref,maks,i: integer; | '''var''' mini_pref,biez_pref,maks,i: integer; | ||
Linia 444: | Linia 457: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 4</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Poniższe rozwiązanie opiera się na spostrzeżeniu, że jeśli suma pewnego segmentu o początku w l i końcu w p jest ujemna, lub nawet równa zero, to nie ma sensu tego segmentu przedłużać. Co więcej, wszystkie segmenty o początkach pomiędzy l i p będą podsegmentami tego dotychczas rozpatrywanego, więc nie ma sensu ich rozważać przy poszukiwaniu segmentu o maksymalnej sumie. Jedyną sensowną możliwością jest rozpatrywanie segmentów które zaczynają się od p+1. | Poniższe rozwiązanie opiera się na spostrzeżeniu, że jeśli suma pewnego segmentu o początku w l i końcu w p jest ujemna, lub nawet równa zero, to nie ma sensu tego segmentu przedłużać. Co więcej, wszystkie segmenty o początkach pomiędzy l i p będą podsegmentami tego dotychczas rozpatrywanego, więc nie ma sensu ich rozważać przy poszukiwaniu segmentu o maksymalnej sumie. Jedyną sensowną możliwością jest rozpatrywanie segmentów które zaczynają się od p+1. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 4</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' SegmentOMaksymalnejSumie4(N:integer; A:array[1..N] of integer); | '''program''' SegmentOMaksymalnejSumie4(N:integer; A:array[1..N] of integer); | ||
'''var''' l,p,i,maks,suma: integer; | '''var''' l,p,i,maks,suma: integer; | ||
Linia 483: | Linia 501: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 5</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Poniżej znajduje się inaczej (zwięźlej) zapisane Rozwiązanie 4. W tym rozwiązaniu nie odwołujemy się bezpośrednio do początku i końca aktualnego segmentu, a tylko do jego sumy (biez). | Poniżej znajduje się inaczej (zwięźlej) zapisane Rozwiązanie 4. W tym rozwiązaniu nie odwołujemy się bezpośrednio do początku i końca aktualnego segmentu, a tylko do jego sumy (biez). | ||
'''program''' SegmentOMaksymalnejSumie5(N:integer; A:array[1..N] of integer); | '''program''' SegmentOMaksymalnejSumie5(N:integer; A:array[1..N] of integer); | ||
Linia 504: | Linia 524: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 5 (Część wspólna zbiorów) == | == Zadanie 5 (Część wspólna zbiorów) == | ||
Linia 510: | Linia 530: | ||
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwóch | posortowane rosnąco. Należy traktując A i B jako reprezentacje dwóch | ||
zbiorów wypisać (operacją write) część wspólną tych zbiorów. | zbiorów wypisać (operacją write) część wspólną tych zbiorów. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Będziemy przesuwać się po tablicach od prawej do lewej indeksami ia i ib. Za każdym obrotem pętli przesuwamy ten indeks pod którym jest miejsza wartość, lub oba gdy mają takie same wartości. | Będziemy przesuwać się po tablicach od prawej do lewej indeksami ia i ib. Za każdym obrotem pętli przesuwamy ten indeks pod którym jest miejsza wartość, lub oba gdy mają takie same wartości. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiąznie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' CzęśćWspólna(N:integer; A,B:array[1..N] of integer); | '''program''' CzęśćWspólna(N:integer; A,B:array[1..N] of integer); | ||
//Tablice A i B są posortowane rosnąco | //Tablice A i B są posortowane rosnąco | ||
Linia 539: | Linia 562: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 6 (Suma zbiorów) == | == Zadanie 6 (Suma zbiorów) == | ||
Linia 546: | Linia 569: | ||
zbiorów wypisać (operacją write) sumę tych zbiorów. | zbiorów wypisać (operacją write) sumę tych zbiorów. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Dopóki istnieją elementy w obu tablicach, przesuwamy się tak, jak przy obliczaniu części wspólnej, potem obługujemy końcówki tablic. | Dopóki istnieją elementy w obu tablicach, przesuwamy się tak, jak przy obliczaniu części wspólnej, potem obługujemy końcówki tablic. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Suma(N:integer; A,B:array[1..N] of integer); | '''program''' Suma(N:integer; A,B:array[1..N] of integer); | ||
//Tablice A i B są posortowane rosnąco | //Tablice A i B są posortowane rosnąco | ||
Linia 582: | Linia 609: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Ćwiczenie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Z dwóch pętli while obsługujących końcówki tablic A i B w Rozwiązaniu 1 wykona się co najwyżej jedna. W jakich sytuacjach nie wykona się żadna z nich ? | Z dwóch pętli while obsługujących końcówki tablic A i B w Rozwiązaniu 1 wykona się co najwyżej jedna. W jakich sytuacjach nie wykona się żadna z nich ? | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Można próbować modyfikować rozwiązanie zadania o części wspólnej, tak by oddać analogię między sumą i częścią wspólną zbiorów. Prowadziłoby to do warunku (ia <= N) or (ib <= N) w głównej pętli while. Trzeba jednak na nowo zdefiniować co to znaczy, że pod danym indeksem jest mniejsza wartość niż pod innym indeksem, w sytuacji gdy jeden z tych indeksów może być większy od N. | Można próbować modyfikować rozwiązanie zadania o części wspólnej, tak by oddać analogię między sumą i częścią wspólną zbiorów. Prowadziłoby to do warunku (ia <= N) or (ib <= N) w głównej pętli while. Trzeba jednak na nowo zdefiniować co to znaczy, że pod danym indeksem jest mniejsza wartość niż pod innym indeksem, w sytuacji gdy jeden z tych indeksów może być większy od N. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Suma(N:integer; A,B:array[1..N] of integer); | '''program''' Suma(N:integer; A,B:array[1..N] of integer); | ||
//Tablice A i B są posortowane rosnąco | //Tablice A i B są posortowane rosnąco | ||
Linia 631: | Linia 665: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 7 (Podciąg) == | == Zadanie 7 (Podciąg) == | ||
Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 0. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]). | Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 0. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Każdy element tablicy A musi odnaleźć swoją kopię w tablicy B. Przechodząc tablicę A od lewej do prawej i szukamy odpowiednika A[i] w części B, która jeszcze nie została odwiedzona. | Każdy element tablicy A musi odnaleźć swoją kopię w tablicy B. Przechodząc tablicę A od lewej do prawej i szukamy odpowiednika A[i] w części B, która jeszcze nie została odwiedzona. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Podciąg(N,M:integer; A:array[1..N] of integer; B:array[1..M] of integer); | '''program''' Podciąg(N,M:integer; A:array[1..N] of integer; B:array[1..M] of integer); | ||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
Linia 666: | Linia 704: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 8 (Odwracanie tablicy) == | == Zadanie 8 (Odwracanie tablicy) == | ||
Dana tablica A typu array[0..N-1] of integer, N > 1. Napisz program odwracający kolejność elementów w A. | Dana tablica A typu array[0..N-1] of integer, N > 1. Napisz program odwracający kolejność elementów w A. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Należy zamienić element 0 z N-1, 1 z N-2 itd. | Należy zamienić element 0 z N-1, 1 z N-2 itd. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Odwracanie1(N:integer; A:array[0..N-1] of integer); | '''program''' Odwracanie1(N:integer; A:array[0..N-1] of integer); | ||
'''var''' l,pom: integer; | '''var''' l,pom: integer; | ||
Linia 695: | Linia 737: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
To samo co w Rozwiązaniu 1 można zrobić używjąc dwóch indeksów l i p na oznaczenie elemnetów z lewej i prawej strony tablicy. W ten sposób na pewno nie pomylimy się wyliczając element, z którym ma się zamienić l (czy to N-1-l, N-l, N-(l+1) itp.) i warunek w while. | To samo co w Rozwiązaniu 1 można zrobić używjąc dwóch indeksów l i p na oznaczenie elemnetów z lewej i prawej strony tablicy. W ten sposób na pewno nie pomylimy się wyliczając element, z którym ma się zamienić l (czy to N-1-l, N-l, N-(l+1) itp.) i warunek w while. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Odwracanie2(N:integer; A:array[0..N-1] of integer); | '''program''' Odwracanie2(N:integer; A:array[0..N-1] of integer); | ||
'''var''' l,p,pom: integer; | '''var''' l,p,pom: integer; | ||
Linia 734: | Linia 781: | ||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 9 (Przesunięcie cykliczne) == | == Zadanie 9 (Przesunięcie cykliczne) == | ||
Dana tablica A typu array[0..N-1] of integer, N > 1, i liczba naturalna k > 1. Napisz program realizujący przesunięcie cykliczne w prawo o k pól, czyli przesuwający zawartość pola A[i] na A[(i+k) mod N] dla każdego i < N. | Dana tablica A typu array[0..N-1] of integer, N > 1, i liczba naturalna k > 1. Napisz program realizujący przesunięcie cykliczne w prawo o k pól, czyli przesuwający zawartość pola A[i] na A[(i+k) mod N] dla każdego i < N. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Najprościej rozwiązać to zadanie używając dodatkowej pamięci rozmiaru N. | Najprościej rozwiązać to zadanie używając dodatkowej pamięci rozmiaru N. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Przesuń1(N,k:integer; A:array[0..N-1] of integer); | '''program''' Przesuń1(N,k:integer; A:array[0..N-1] of integer); | ||
'''var''' i: integer; | '''var''' i: integer; | ||
Linia 758: | Linia 809: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Można też skorzystać z rozkładu permutacji na cykle. Długość każdego takiego cyklu wynosi N/nwd(N,k), a na dodatek pierwsze nwd(N,k) elementów tablicy należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nwd. | Można też skorzystać z rozkładu permutacji na cykle. Długość każdego takiego cyklu wynosi N/nwd(N,k), a na dodatek pierwsze nwd(N,k) elementów tablicy należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nwd. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Przesuń2(N,k:integer; A:array[0..N-1] of integer); | '''program''' Przesuń2(N,k:integer; A:array[0..N-1] of integer); | ||
// k > 1 | // k > 1 | ||
Linia 787: | Linia 843: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 3</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Można też zauważyć, że przesunięcie cykliczne o k w prawo można zrealizować poprzez trzy odwrócenia pewnych segmentów tablicy. | Można też zauważyć, że przesunięcie cykliczne o k w prawo można zrealizować poprzez trzy odwrócenia pewnych segmentów tablicy. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 3</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Przesun3(N,k:integer; A:array[0..N-1] of integer); | '''program''' Przesun3(N,k:integer; A:array[0..N-1] of integer); | ||
// k > 1 | // k > 1 | ||
Linia 815: | Linia 876: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 10 (Następna permutacja) == | == Zadanie 10 (Następna permutacja) == | ||
Linia 828: | Linia 889: | ||
3 2 1 | 3 2 1 | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Zastanów się, która część tablicy pozostanie taka sama w następnej permutacji. | Zastanów się, która część tablicy pozostanie taka sama w następnej permutacji. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiąznie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' NastępnaPermutacja(N:integer; A:array[1..N] of integer); | '''program''' NastępnaPermutacja(N:integer; A:array[1..N] of integer); | ||
//Permutacja zapisana w A nie jest ostatnia leksykograficznie | //Permutacja zapisana w A nie jest ostatnia leksykograficznie | ||
Linia 859: | Linia 924: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 11 (Segment o danej sumie) == | == Zadanie 11 (Segment o danej sumie) == | ||
Tablica A typu array[1..N] of integer, N > 0, zawiera tylko liczby dodatnie. Napisz program, który dla danego W typu integer sprawdza, czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W<math>=A[l]+...+A[p-1]</math>). | Tablica A typu array[1..N] of integer, N > 0, zawiera tylko liczby dodatnie. Napisz program, który dla danego W typu integer sprawdza, czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W<math>=A[l]+...+A[p-1]</math>). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Podobnie jak w zadaniu o segmencie o maksymalnej sumie można dla | Podobnie jak w zadaniu o segmencie o maksymalnej sumie można dla | ||
danego początku l obliczać po kolei sumy coraz dłuższych segmentów zaczynających się w l. | danego początku l obliczać po kolei sumy coraz dłuższych segmentów zaczynających się w l. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' SegmentODanejSumie1(N,W:integer; A:array[1..N] of integer); | '''program''' SegmentODanejSumie1(N,W:integer; A:array[1..N] of integer); | ||
//Tablica A zawiera tylko liczby dodatnie | //Tablica A zawiera tylko liczby dodatnie | ||
Linia 900: | Linia 969: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Podobnie jak w zadaniu o segmencie o maksymalnej sumie, możliwe też jest rozwiązanie o liniowym koszcie czasowym. | Podobnie jak w zadaniu o segmencie o maksymalnej sumie, możliwe też jest rozwiązanie o liniowym koszcie czasowym. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer); | '''program''' SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer); | ||
//Tablica A zawiera tylko liczby dodatnie | //Tablica A zawiera tylko liczby dodatnie | ||
Linia 944: | Linia 1018: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 12 (Głosowanie większościowe) == | == Zadanie 12 (Głosowanie większościowe) == | ||
Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdź, czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak - wskaż go. | Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdź, czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak - wskaż go. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Najprościej jest dla każdego elementu policzyć liczbę wystąpień w tablicy. Jest to oczywiście rozwiązanie o kwadratowym koszcie czasowym. | Najprościej jest dla każdego elementu policzyć liczbę wystąpień w tablicy. Jest to oczywiście rozwiązanie o kwadratowym koszcie czasowym. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiąznie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Głosowanie1(N:integer; A:array[1..N] of integer); | '''program''' Głosowanie1(N:integer; A:array[1..N] of integer); | ||
{Program wypisuje wartość tego elementu, który występuje ponad połowę | {Program wypisuje wartość tego elementu, który występuje ponad połowę | ||
Linia 982: | Linia 1059: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwóch faz. W pierwszej wyznaczamy takie kand, że jeśli jest lider, to jest nim kand; w drugiej (banalnej) sprawdzamy, czy kand wygrał. | To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwóch faz. W pierwszej wyznaczamy takie kand, że jeśli jest lider, to jest nim kand; w drugiej (banalnej) sprawdzamy, czy kand wygrał. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' Głosowanie2(N:integer; A:array[1..N] of integer); | '''program''' Głosowanie2(N:integer; A:array[1..N] of integer); | ||
'''var''' ile,i,kand,lider: integer; | '''var''' ile,i,kand,lider: integer; | ||
Linia 1021: | Linia 1103: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 13 (Arytmetyka liczb wielocyfrowych) == | == Zadanie 13 (Arytmetyka liczb wielocyfrowych) == | ||
Linia 1029: | Linia 1111: | ||
# iloczyn A i B do C (C powinno być tablicą dwa razy dłuższą niż A i B, żeby móc pomieścić wynik). | # iloczyn A i B do C (C powinno być tablicą dwa razy dłuższą niż A i B, żeby móc pomieścić wynik). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''const''' N=100; | '''const''' N=100; | ||
b=10; | b=10; | ||
Linia 1093: | Linia 1177: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 13:18, 28 maj 2020
<<< Powrót do modułu Wprowadzenie do programowania
Ta strona zawiera podstawowe zadania na tablice.
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Zadanie 1 (Flaga polska)
Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Podaj algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony czerwone, potem białe. Robot może wykonywać dwa rodzaje operacji:
- Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n)
- Z(i,j) - zamienia żetony z i-tej i j-tej urny (1 ≤ i,j ≤ n)
Uwagi:
- Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz.
- Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1.
- Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Wskazówka 3
Rozwiązanie 3
Wskazówka 4
Rozwiązanie 4
Ćwiczenie 1
Ćwiczenie 2
Zadanie 2 (Flaga trójkolorowa)
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie.
Wskazówka 1
Rozwiązanie 1
Rozwiązanie 2
Zadanie 3 (Najdłuższe plateau)
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).
Wskazówka 1
Rozwiąznie 1
Wskazówka 2
Rozwiąznie 2
Ćwiczenie 1
Inna wersja zadania
A co byłoby gdyby tablica była posortowana ?
Wskazówka 3
Rozwiąznie 3
Zadanie 4 (Segment o maksymalnej sumie)
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Wskazówka 3
Rozwiązanie 3
Wskazówka 4
Rozwiązanie 4
Rozwiązanie 5
Zadanie 5 (Część wspólna zbiorów)
Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwóch zbiorów wypisać (operacją write) część wspólną tych zbiorów.
Wskazówka 1
Rozwiąznie 1
Zadanie 6 (Suma zbiorów)
Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) sumę tych zbiorów.
Wskazówka 1
Rozwiązanie 1
Ćwiczenie 1
Wskazówka 2
Rozwiązanie 2
Zadanie 7 (Podciąg)
Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 0. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]).
Wskazówka 1
Rozwiązanie 1
Zadanie 8 (Odwracanie tablicy)
Dana tablica A typu array[0..N-1] of integer, N > 1. Napisz program odwracający kolejność elementów w A.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Zadanie 9 (Przesunięcie cykliczne)
Dana tablica A typu array[0..N-1] of integer, N > 1, i liczba naturalna k > 1. Napisz program realizujący przesunięcie cykliczne w prawo o k pól, czyli przesuwający zawartość pola A[i] na A[(i+k) mod N] dla każdego i < N.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Wskazówka 3
Rozwiązanie 3
Zadanie 10 (Następna permutacja)
Tablica A typu array[1..N] of integer, N > 0, zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną leksykograficznie permutację. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie.
Przykład Dla N=3 kolejne permutacje w porządku leksykograficznym wyglądają następująco:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
Wskazówka 1
Rozwiąznie 1
Zadanie 11 (Segment o danej sumie)
Tablica A typu array[1..N] of integer, N > 0, zawiera tylko liczby dodatnie. Napisz program, który dla danego W typu integer sprawdza, czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W).
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Zadanie 12 (Głosowanie większościowe)
Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdź, czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak - wskaż go.
Wskazówka 1
Rozwiąznie 1
Wskazówka 2
Rozwiązanie 2
Zadanie 13 (Arytmetyka liczb wielocyfrowych)
Liczby wielocyfrowe będą reprezentowane w tablicach typu liczba=array[0..N-1] of integer, N > 1, w taki sposób, że najmniej znacząca cyfra jest pod indeksem 0. Rozpatrujemy liczby przy podstawie b > 1. Napisz procedury obliczające:
- sumę liczb A i B do C. Jeśli wynik nie zmieści się w C, to wartość C nie ma znaczenia. Zmienna przepełnienie wskazuje czy do niego doszło czy nie.
- różnicę A i B do C. Jeśli wynik miałby byc liczbą ujemną, to wartość C nie ma znaczenia. Zmienna ujemny wskazuje jaki jest znak wyniku.
- iloczyn A i B do C (C powinno być tablicą dwa razy dłuższą niż A i B, żeby móc pomieścić wynik).
Rozwiązanie 1