Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami
mNie podano opisu zmian |
Poprawianie formatowania |
||
Linia 1: | Linia 1: | ||
Ta strona | Ta strona zawiera podstawowe zadania na tablice. | ||
== Zadanie 1 (Flaga polska)== | == Zadanie 1 (Flaga polska)== | ||
Linia 12: | Linia 12: | ||
#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"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska1(N,A); | '''program''' FlagaPolska1(N,A); | ||
Linia 29: | Linia 28: | ||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać czerwone z czerwonymi. Mozna tego uniknąć wprowadzając dodatkową pętlę po czerwonych od końca tablicy. | |||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska2(N,A); | '''program''' FlagaPolska2(N,A); | ||
Linia 51: | Linia 50: | ||
'''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<c to w przypadku tablicy zawierającej same białe żetony doszłoby do wyjścia poza zakres (odwołanie do Kol(0)). 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> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 3''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska3(N,A); | '''program''' FlagaPolska3(N,A); | ||
Linia 84: | Linia 83: | ||
'''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 (czyli zamian jest co najwyżej N div 2). Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. Jednak dla tablicy złożonej z jednego żetonu czerwonego i potem samych białych będzie potrzeba N-1 zamian. | |||
</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''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska4(N,A); | '''program''' FlagaPolska4(N,A); | ||
Linia 111: | Linia 110: | ||
żeby najpierw były elementy <0, potem =0, a na końcu >0. | żeby najpierw były elementy <0, potem =0, a na końcu >0. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaHolenderska(N,A); | '''program''' FlagaHolenderska(N,A); | ||
Linia 138: | Linia 137: | ||
najdłuższego stałego segmentu (spójnego fragmentu tablicy). | najdłuższego stałego segmentu (spójnego fragmentu tablicy). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' NajdluzszePlateau1(N,A); | '''program''' NajdluzszePlateau1(N,A); | ||
Linia 148: | Linia 146: | ||
'''while''' p < N '''do''' '''begin''' | '''while''' p < N '''do''' '''begin''' | ||
k:=p+1; koniec:=false; | k:=p+1; koniec:=false; | ||
'''while''' (k <= N) and (not koniec) '''do''' | '''while''' (k <= N) '''and''' ('''not''' koniec) '''do''' | ||
'''if''' A[k]=w '''then''' k:=k+1 | '''if''' A[k]=w '''then''' k:=k+1 | ||
'''else''' koniec:=true; | '''else''' koniec:=true; | ||
Linia 160: | Linia 158: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' NajdluzszePlateau2(N,A); | '''program''' NajdluzszePlateau2(N,A); | ||
Linia 174: | Linia 172: | ||
k:=k+1; | k:=k+1; | ||
'''end'''; | '''end'''; | ||
maks:=max(maks, dl); | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 4 (Segment o maksymalnej sumie) == | == Zadanie 4 (Segment o maksymalnej sumie) == | ||
Linia 185: | Linia 181: | ||
maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0. | maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Wskazówka 1''' <div class="mw-collapsible-content" style="display:none">Najprostsze rozwiązanie ma złożoność kwadratową.</div> | |||
== | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' NajdluzszePlateau2(N,A); | '''program''' NajdluzszePlateau2(N,A); | ||
'''var''' p,k,suma, maks: integer; | '''var''' p,k,suma, maks: integer; | ||
'''begin''' | '''begin''' | ||
maks:=0; | |||
'''for''' p:=1 '''to''' N '''do''' '''begin''' | |||
suma:=0; | |||
'''for''' k:=p '''to''' N '''do''' '''begin''' | |||
suma:=suma+A[k]; | |||
maks:=max(maks,suma); | |||
'''end'''; | |||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 206: | Linia 203: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Wskazówka 2''' <div class="mw-collapsible-content" style="display:none">Optymalne rozwiązanie ma liniową złożoność.</div> | |||
== | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' NajdluzszePlateau2(N,A); | '''program''' NajdluzszePlateau2(N,A); | ||
'''var''' i,biez,maks: integer; | '''var''' i,biez,maks: integer; | ||
'''begin''' | '''begin''' | ||
maks:=0; | |||
biez:=0; | |||
'''for''' i:=1 '''to''' N '''do''' '''begin''' | |||
biez:=max(0,biez+A[i]); | |||
maks:=max(maks, biez); | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 227: | Linia 226: | ||
zbiorów wypisać (operacją write) cześć wspólną tych zbiorów. | zbiorów wypisać (operacją write) cześć wspólną tych zbiorów. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' CescWspolna(N,A,B); | '''program''' CescWspolna(N,A,B); | ||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
'''begin''' | '''begin''' | ||
ia:=1; ib:=1; | |||
'''while''' (ia <= N) '''and''' (ib <= N) '''do''' | |||
'''if''' A[ia] < B[ib] '''then''' ia:=ia+1 | |||
'''else''' | |||
'''if''' A[ia] > B[ib] '''then''' ib:=ib+1; | |||
'''else''' '''begin''' | |||
write(A{ia], ' '); | |||
ia:=ia+1; | |||
ib:=ib+1; | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 252: | Linia 251: | ||
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"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Suma(N,A,B); | '''program''' Suma(N,A,B); | ||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
'''begin''' | '''begin''' | ||
ia:=1; ib:=1; | |||
'''while''' (ia <= N) '''and''' (ib <= N) '''do''' | |||
'''if''' A[ia] < B[ib] '''then''' '''begin''' | |||
write(A{ia], ' '); | |||
ia:=ia+1; | |||
'''end''' | |||
'''else''' | |||
'''if''' A[ia] > B[ib] '''then''' '''begin''' | |||
write(B{ib], ' '); | |||
ib:=ib+1; | |||
'''end''' | |||
'''else''' '''begin''' | |||
write(A{ia], ' '); | |||
ia:=ia+1; | |||
ib:=ib+1; | |||
'''end'''; | |||
'''while''' ia <= N '''do''' write(A{ia], ' '); | |||
'''while''' ib <= N '''do''' write(B{ib], ' '); | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Suma(N,A,B); | '''program''' Suma(N,A,B); | ||
Linia 288: | Linia 286: | ||
'''begin''' | '''begin''' | ||
mniejsze:=false; | mniejsze:=false; | ||
'''if''' (ib > N) and (ia <= N) '''then''' mniejsze:=true | '''if''' (ib > N) '''and''' (ia <= N) '''then''' mniejsze:=true | ||
'''else''' '''if''' (ib <= N) and (ia <= N) '''then''' | '''else''' '''if''' (ib <= N) '''and''' (ia <= N) '''then''' | ||
'''if''' A[ia] < B[ib] '''then''' mniejsze:=true | '''if''' A[ia] < B[ib] '''then''' mniejsze:=true | ||
'''end'''; | '''end'''; | ||
'''begin''' | '''begin''' | ||
ia:=1; | |||
ib:=1; | |||
'''while''' (ia <= N) '''or''' (ib <= N) '''do''' | |||
'''if''' mniejsze(ia,ib) '''then''' '''begin''' | |||
write(A{ia], ' '); | |||
ia:=ia+1; | |||
'''end''' | |||
'''else''' | |||
'''if''' mniejsze(ib,ia) '''then''' '''begin''' | |||
write(B{ib], ' '); | |||
ib:=ib+1; | |||
'''end''' | |||
'''else''' '''begin''' | |||
write(A{ia], ' '); | |||
ia:=ia+1; | |||
ib:=ib+1; | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 316: | Linia 314: | ||
== 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 > 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)]). | 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)]). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Podciag(N,A,M,B); | '''program''' Podciag(N,A,M,B); | ||
Linia 323: | Linia 321: | ||
istnieje: boolean; | istnieje: boolean; | ||
'''begin''' | '''begin''' | ||
'''if''' N > M '''then''' istnieje:=false | |||
'''else''' '''begin''' | |||
ia:=1;ib:=1; | |||
'''while''' (ia <= N) '''and''' (ib <= M) '''do''' | |||
'''if''' A[ia] <> B[ib] '''then''' ib:=ib+1; | |||
'''else''' '''begin''' | |||
ia:=ia+1; | |||
ib:=ib+1; | |||
'''end'''; | |||
istnieje:=(ia>N); | |||
'''end'''; | '''end'''; | ||
'''end'''. | '''end'''. | ||
Linia 340: | Linia 338: | ||
== 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"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Odwracanie(N,A); | '''program''' Odwracanie(N,A); | ||
'''var''' p,k,pom: integer; | '''var''' p,k,pom: integer; | ||
'''begin''' | '''begin''' | ||
p:=0; k:=N-1; | |||
'''while''' p < k '''do''' '''begin''' | |||
pom:=A[p]; | |||
A[p]:=A[k]; | |||
A[k]:=pom; | |||
p:=p+1; | |||
k:=k-1; | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
Można też odwracać jedynie część tablicy. Zapiszmy to w formie procedury | Można też odwracać jedynie część tablicy. Zapiszmy to w formie procedury | ||
Linia 359: | Linia 358: | ||
'''var''' pom: integer; | '''var''' pom: integer; | ||
'''begin''' | '''begin''' | ||
'''while''' p < k '''do''' '''begin''' | |||
pom:=A[p]; | |||
A[p]:=A[k]; | |||
A[k]:=pom; | |||
p:=p+1; | |||
k:=k-1; | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 372: | Linia 371: | ||
== 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"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
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. | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Przesun1(N,A,k); | '''program''' Przesun1(N,A,k); | ||
Linia 381: | Linia 379: | ||
P: array[0..N-1] of integer; | P: array[0..N-1] of integer; | ||
'''begin''' | '''begin''' | ||
'''for'' i:=0 '''to''' N-1 '''do''' P[(i+k)mod N]:=A[i]; | |||
'''for'' i:=0 '''to''' N-1 '''do''' A[i]:=P[i]; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 388: | Linia 386: | ||
Można też skorzystać z rozkladu na cykle elementów tablicy. Długość każdego takiego cyklu wynosi nww(N,k) a na dodatek pierwsze nwd(N,k) elementów należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nww i nwd. | Można też skorzystać z rozkladu na cykle elementów tablicy. Długość każdego takiego cyklu wynosi nww(N,k) a na dodatek pierwsze nwd(N,k) elementów należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nww i nwd. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Przesun2(N,A,k); | '''program''' Przesun2(N,A,k); | ||
Linia 410: | Linia 408: | ||
Można też zauważyć, że przesunięcie cykliczne o k w prawo realizuje się porzez trzy odwrócenia pewnych segmentów w tablicy. Procedura Odwroc pochodzi z zadania 8. | Można też zauważyć, że przesunięcie cykliczne o k w prawo realizuje się porzez trzy odwrócenia pewnych segmentów w tablicy. Procedura Odwroc pochodzi z zadania 8. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 3''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Przesun3(N,A,k); | '''program''' Przesun3(N,A,k); | ||
Linia 425: | Linia 423: | ||
Tablica A typu array[1..N] of integer zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną | 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. | leksykograficznie permutację. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie. | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Najpierw szukamy od tyłu pierwszego elementu, takiego że A[i] < A[i+1] (tu korzystamy z zalożenia że to nie | Najpierw szukamy od tyłu pierwszego elementu, takiego że A[i] < A[i+1] (tu korzystamy z zalożenia że to nie | ||
Linia 450: | Linia 448: | ||
== Zadanie 11 (Segment o zadanej sumie) == | == 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 = \Sum_i \in [p ..k-1] A[i]) | 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 = \Sum_i \in [p ..k-1] A[i]) | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Linia 482: | Linia 480: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
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. | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Glosowanie1(N,A); | '''program''' Glosowanie1(N,A); | ||
Linia 489: | Linia 487: | ||
i:=1; | i:=1; | ||
zwyciezca:=0; | zwyciezca:=0; | ||
'''while''' (i <= (N div 2) + 1) and (zwyciezca=0)'''do''' '''begin''' | '''while''' (i <= (N div 2) + 1) '''and''' (zwyciezca=0)'''do''' '''begin''' | ||
ile:=0; | ile:=0; | ||
'''for j:=1 '''to''' N '''do''' if A[i]=A[j] '''then''' ile:=ile+1; | '''for j:=1 '''to''' N '''do''' if A[i]=A[j] '''then''' ile:=ile+1; | ||
Linia 500: | Linia 498: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwu faz. W pierwszej wyznaczamy takie a, że jeśli jest zwycięzca, to jest nim a, w drugiej (banalnej) sprawdzamy czy a wygrał. | To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwu faz. W pierwszej wyznaczamy takie a, że jeśli jest zwycięzca, to jest nim a, w drugiej (banalnej) sprawdzamy czy a wygrał. | ||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Glosowanie2(N,A); | '''program''' Glosowanie2(N,A); | ||
Linia 537: | Linia 535: | ||
* 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). | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Linia 595: | Linia 593: | ||
== Zadanie INNE (Najdłuższy podciąg niemalejący) == | == Zadanie INNE (Najdłuższy podciąg niemalejący) == | ||
Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A. | Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A. | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Kluczowe jest użycie dodatkowej tablicy B rozmiaru N, w której pod indeksem i przechowuje się minimalną wartość kończącą podciąg niemalejący o długości i w dotychczas przejrzanej części tablicy A, od 1 do k. Żeby uwzględnić A[k+1] należy w tablicy B odnależć miejsce na A[k+1] (najlepiej binarnie). | Kluczowe jest użycie dodatkowej tablicy B rozmiaru N, w której pod indeksem i przechowuje się minimalną wartość kończącą podciąg niemalejący o długości i w dotychczas przejrzanej części tablicy A, od 1 do k. Żeby uwzględnić A[k+1] należy w tablicy B odnależć miejsce na A[k+1] (najlepiej binarnie). | ||
Linia 622: | Linia 620: | ||
== Zadanie | == Zadanie m == | ||
Napisz program | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' (N,A); | '''program''' (N,A); | ||
'''var''' : integer; | '''var''' : integer; | ||
'''begin''' | '''begin''' | ||
writeln('To jest rozwiązanie 1') | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie | == Zadanie n == | ||
=== | Napisz program n | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
To jest wskazówka 1 | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie 1''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''program''' (N,A); | |||
'''var''' : integer; | |||
'''begin''' | |||
writeln('To jest rozwiązanie 1') | |||
'''end'''. | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Wskazówka 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
To jest wskazówka 2 | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 2''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' (N,A); | '''program''' (N,A); | ||
'''var''' : integer; | '''var''' : integer; | ||
'''begin''' | '''begin''' | ||
writeln('To jest rozwiązanie 2') | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> |
Wersja z 11:01, 11 lip 2006
Ta strona zawiera podstawowe zadania na tablice.
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). Należy podać algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony białe, potem czerwone. 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.
Rozwiązanie 1
Rozwiązanie 2
Rozwiązanie 3
Rozwiązanie 4
Zadanie 2 (Flaga holenderska)
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy <0, potem =0, a na końcu >0.
Rozwiązanie 1
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.
Najprościej rozwiązać to zadanie używając dodatkowej pamięci rozmiaru N. Rozwiązanie 1
Można też skorzystać z rozkladu na cykle elementów tablicy. Długość każdego takiego cyklu wynosi nww(N,k) a na dodatek pierwsze nwd(N,k) elementów należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nww i nwd.
Rozwiązanie 2
Można też zauważyć, że przesunięcie cykliczne o k w prawo realizuje się porzez trzy odwrócenia pewnych segmentów w tablicy. Procedura Odwroc pochodzi z zadania 8.
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
Najpierw szukamy od tyłu pierwszego elementu, takiego że A[i] < A[i+1] (tu korzystamy z zalożenia że to nie ostatnia permutacja), potem szukamy na prawo od i najmniejszego większego od niego elementu k (uwaga: dużo wygodniej to robic od prawej strony!), potem zamieniamy te elementy i odwracamy kolejność elementów na prawo od i.
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 = \Sum_i \in [p ..k-1] A[i]) 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.
Możliwe rozwiązania zadania
Najprościej jest dla każdego elementu policzyć liczbę wystąpień w tablicy. Jest to oczywiście rozwiązanie o kwadratowym koszcie czasowym. Rozwiązanie 1
To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwu faz. W pierwszej wyznaczamy takie a, że jeśli jest zwycięzca, to jest nim a, w drugiej (banalnej) sprawdzamy czy a wygrał. 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
Zadanie INNE (Najdłuższy podciąg niemalejący)
Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A. Rozwiązanie 1
Kluczowe jest użycie dodatkowej tablicy B rozmiaru N, w której pod indeksem i przechowuje się minimalną wartość kończącą podciąg niemalejący o długości i w dotychczas przejrzanej części tablicy A, od 1 do k. Żeby uwzględnić A[k+1] należy w tablicy B odnależć miejsce na A[k+1] (najlepiej binarnie).
Zadanie m
Napisz program
Rozwiązanie 1
Zadanie n
Napisz program n
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2