Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami
→Zadanie 11 (Segment o zadanej sumie): Upiększenie wzoru |
Koszty i wskazowki |
||
Linia 8: | Linia 8: | ||
== Zadanie 1 (Flaga polska)== | == 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). | 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) | *Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n) | ||
Linia 18: | Linia 18: | ||
#Nie można założyć, że występuje choć jeden żeton w każdym z kolorów. | #Nie można założyć, że występuje choć jeden żeton w każdym z kolorów. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Należy przesuwać się indeksem c od początku tablicy zaś indeksem b od końca. Intencją jest utrzymywanie następującego niezmmiennika: wszystkie elementy tablicy o indeksach mniejszych od c są czerwone, zaś wiekszych od b są białe. Indeksy c i b będą się do siebie zbliżać i ostatecznie gdy c będzie równe b to tablica będzie uporządkowana. | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
Linia 26: | Linia 32: | ||
'''var''' b,c : integer; | '''var''' b,c : integer; | ||
'''begin''' | '''begin''' | ||
c:=1; b:=n; | |||
'''while''' b | '''while''' c < b '''do''' | ||
'''if''' Kol( | '''if''' Kol(c)=czerwony '''then''' c:=c+1 | ||
'''else''' '''begin''' | '''else''' '''begin''' | ||
Z(c,b); | Z(c,b); | ||
b:=b-1; | |||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać | ''Koszt czasowy'': liniowy względem N | ||
''Koszt pamięciowy'': stały | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać białe z białymi. Można tego uniknąć wprowadzając dodatkową pętlę po białych od końca tablicy. | |||
</div> | </div> | ||
</div> | </div> | ||
Linia 45: | Linia 59: | ||
'''var''' b,c : integer; | '''var''' b,c : integer; | ||
'''begin''' | '''begin''' | ||
c:=1; b:=n; | |||
'''while''' b | '''while''' c < b '''do''' | ||
'''if''' Kol( | '''if''' Kol(c)=czerwony '''then''' c:=c+1 | ||
'''else''' '''begin''' | '''else''' '''begin''' | ||
'''while''' Kol( | '''while''' Kol(b)=biały '''and''' (c<b) '''do''' b:=b-1; | ||
'''if''' b<c '''then''' '''begin''' | '''if''' b<c '''then''' '''begin''' | ||
Z(c,b); | Z(c,b); | ||
b:=b-1; | |||
'''end'''; | '''end'''; | ||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
W rozwiązaniu 2 są dwie zagnieżdżone pętle while. Trzeba zwrócić uwagę, że gdyby nie warunek b | W rozwiązaniu 2 są dwie zagnieżdżone pętle while. Trzeba zwrócić uwagę, że gdyby nie warunek c<b to w przypadku tablicy zawierającej same białe żetony doszłoby do wyjścia poza zakres (odwołanie do Kol(0)). | ||
''Koszt czasowy'': liniowy względem N | |||
''Koszt pamięciowy'': stały | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 3''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
W Rozwiązaniu 2 można uniknąć zagnieżdżonych while'i, trzeba jednak uważać aby nie sprawdzać kilka razy koloru tego samego żetonu. | |||
</div> | </div> | ||
</div> | </div> | ||
Linia 65: | Linia 89: | ||
'''const''' bialy = 0; | '''const''' bialy = 0; | ||
czerwony = 1; | czerwony = 1; | ||
'''var''' b,c : integer; | '''var''' b,c,kb,kc : integer; | ||
'''begin''' | '''begin''' | ||
c:=1; kc:=Kol(c); | |||
b:=n; kc:=Kol(b); | |||
'''while''' b | '''while''' c < b '''do''' | ||
'''if''' | '''if''' kc=czerwony '''then''' '''begin''' | ||
c:=c+1; | |||
kc:=Kol(c); | |||
'''end''' | '''end''' | ||
'''else''' | '''else''' | ||
'''if''' | '''if''' kb=biały '''then''' '''begin''' | ||
b:=b-1; | |||
kb:=Kol(b); | |||
'''end''' | '''end''' | ||
'''else''' '''begin''' | '''else''' '''begin''' | ||
Z(c,b); | Z(c,b); | ||
c:=c+1; | |||
b:=b-1; | |||
'''if''' b | '''if''' c < b '''then''' '''begin''' | ||
kc:=Kol(c); | |||
kb:=Kol(b); | kb:=Kol(b); | ||
'''end;'''; | '''end;'''; | ||
'''end;''' | '''end;''' | ||
'''end'''. | '''end'''. | ||
W rozwiązaniu 3 każdy żeton jest sprawdzany co najwyżej raz, a każda zamiana ustawia na dobrych miejscach 2 żetony ( | W rozwiązaniu 3 każdy żeton jest sprawdzany co najwyżej raz, a każda zamiana ustawia na dobrych miejscach 2 żetony (inaczej mówiąc tych żetonów nie trzeba już będzie przestawiać). A więc wszystkich zamian jest co najwyżej N div 2. Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. | ||
''Koszt czasowy'': liniowy względem N | |||
''Koszt pamięciowy'': stały | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 4''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. Tu oba indeksy b i c przesuwają się od początku tablicy a niezmiennikiem jest to, że wszystkie elementy tablicy o indeksach mniejszych od c są czerwone, zaś te o indeksach wiekszych równych od c i miejszych od b są białe. | |||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 4''' | '''Rozwiązanie 4''' | ||
Linia 100: | Linia 135: | ||
'''var''' b,c : integer; | '''var''' b,c : integer; | ||
'''begin''' | '''begin''' | ||
c:=1; b:=1; | |||
'''while''' | '''while''' c <= N '''do''' | ||
'''if''' Kol( | '''if''' Kol(b)=biały '''then''' b:=b+1 | ||
'''else''' '''begin''' | '''else''' '''begin''' | ||
Z(c,b); | Z(c,b); | ||
Linia 109: | Linia 144: | ||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
''Koszt czasowy'': liniowy względem N | |||
''Koszt pamięciowy'': stały | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Pytanko 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Dla jakich danych algorytm przedstawiony w Rozwiązaniu 4 dokona N-1 zamian? | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Pytanko 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Jak trzeba by zmienić powyższe rozwiązania, gdyby zamiana Z(i,j) była dozwolona tylko dla i <> j ? | |||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 2 (Flaga | |||
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, | == Zadanie 2 (Flaga trójkolorowa) == | ||
żeby najpierw były elementy | 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. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Rozwiązanie dla flagi trójkolorowej jest uogólnieniem rozwiązania dla flagi dwukolorowej. Rozwiązanie 1 poniżej jest kombinacją rozwiązań 3 i 4 z zadania 1; zaś Rozwiązanie 2 poniżej jest bezpośrednim uogólnieniem rozwiązania 4 z zadania 1. Jeśli chodzi o liczbę zamian to lepsze wydaje się Rozwiązanie 1, gdyż od razu na dobre miejsca trafiają elementy ujemne i dodatnie. | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
Linia 124: | Linia 180: | ||
m:=1; r:=1; w:=N; | m:=1; r:=1; w:=N; | ||
'''while''' r <= w '''do''' | '''while''' r <= w '''do''' | ||
'''if''' A[r]=0 '''then''' r:=r+1 | '''if''' A[r]=0 '''then''' r:=r+1 //przedluzam segment liczb dodatnich | ||
'''else''' | '''else''' | ||
'''if''' A[r]<0 '''then''' '''begin''' | '''if''' A[r]<0 '''then''' '''begin''' //zamieniam wartosci w A[r] i A[m] | ||
pom:=A[r]; A[r]:=A[m]; A[m]:=pom; | pom:=A[r]; A[r]:=A[m]; A[m]:=pom; //po zamianie A[r]=0, A[m] < 0 wiec | ||
m:=m+1; | m:=m+1; //zwiekszam oba indeksy r i m | ||
r:=r+1; | r:=r+1; | ||
'''end''' | '''end''' | ||
'''else''' '''begin''' | '''else''' '''begin''' | ||
pom:=A[r]; A[r]:=A[w]; A[w]:=pom; | pom:=A[r]; A[r]:=A[w]; A[w]:=pom; //zamieniam wartosci w A[r] i A[w] | ||
w:=w-1; | w:=w-1; //po zamianie A[w]>0, | ||
'''end'''; //ale o A[r] nic nie wiem | |||
'''end'''. | |||
''Koszt czasowy'': liniowy względem N | |||
''Koszt pamięciowy'': stały | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' FlagaHolenderska(N,A); | |||
'''var''' m,r,w,pom : integer; | |||
'''begin''' | |||
m:=1; r:=1; w:=1; | |||
'''while''' w <= N '''do''' | |||
'''if''' A[w]>0 '''then''' w:=w+1 //przedluzam segment liczb dodatnich | |||
'''else''' | |||
'''if''' A[w]=0 '''then''' '''begin''' | |||
pom:=A[r]; A[r]:=A[w]; A[w]:=pom; //zamieniam wartosci w A[r] i A[w], /po zamianie A[r]=0, A[w] >0 | |||
w:=w+1; //wiec zwiekszam oba indeksy r i w | |||
r:=r+1; | |||
'''end''' | |||
'''else''' '''begin''' //zamieniam cyklicznie A[m], A[r] i A[w] | |||
pom:=A[m]; A[m]:=A[w]; A[w]:=A[r]; A[r]:=pom; | |||
m:=m+1; | |||
r:=r+1; | |||
w:=w+1; | |||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
''Koszt czasowy'': liniowy względem N | |||
''Koszt pamięciowy'': stały | |||
</div> | </div> | ||
</div> | </div> |
Wersja z 18:46, 14 lip 2006
Ta strona zawiera podstawowe zadania na tablice.
Ogladaj 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
Pytanko 1
Pytanko 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 > 1, długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).
Rozwiązanie 1
Rozwiązanie 2
Zadanie 4 (Segment o maksymalnej sumie)
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 1, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.
Rozwiązanie 1
Rozwiązanie 2
Zadanie 5 (Część wspólna zbiorów)
Dane są dwie tablice A i B typu array[1..N] of integer, N > 1. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.
Rozwiązanie 1
Zadanie 6 (Suma zbiorów)
Dane są dwie tablice A i B typu array[1..N] of integer, N > 1. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) sumę tych zbiorów.
Rozwiązanie 1
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 > 1. 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)]).
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.
Rozwiązanie 1
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 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.
Rozwiązanie 1
Zadanie 11 (Segment o zadanej sumie)
Tablica A typu array[1..N] of integer 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ą p, k takie, że W).
Rozwiązanie 1
Zadanie 12 (Głosowanie większościowe)
Dana jest tablica A typu array[1..N] of integer, N > 1. Należy sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskazać go.
Wskazówka 1
Rozwiązanie 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 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