Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Chyba wszystko... |
||
Linia 1: | Linia 1: | ||
Ta strona zawiera podstawowe zadania na tablice. | Ta strona zawiera podstawowe zadania na tablice. Ble ble | ||
== Zadanie 1 (Flaga polska)== | == Zadanie 1 (Flaga polska)== | ||
Linia 436: | Linia 436: | ||
== Zadanie 10 (Następna permutacja) == | == 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ą | 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. | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Rozwiązanie 1''' | |||
<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"> | ||
'''program''' Nastepna_permutacja(N,A); | '''program''' Nastepna_permutacja(N,A); | ||
'''var''' i,k,pom: integer; | '''var''' i,k,pom: integer; | ||
'''begin''' | '''begin''' | ||
i:=N-1; | |||
'''while''' i >= 1 '''do''' '''if''' A[i] > A[i+1] '''then''' i:=i-1; | |||
'''if''' i >= 1 '''then''' '''begin''' | |||
k:=N; | |||
'''while''' k >= i '''do''' '''if''' A[k] < A[i] '''then''' k:=k-1; | |||
pom:=A[i]; | |||
A[i]:=A[k]; | |||
A[k]:=pom; | |||
Odwroc(A,i,N); | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
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. | |||
</div> | </div> | ||
</div> | </div> | ||
Linia 463: | Linia 461: | ||
== 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]) | ||
<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''' Segment_o_danej_sumie(N,A,W); | '''program''' Segment_o_danej_sumie(N,A,W); | ||
Linia 470: | Linia 468: | ||
istnieje: boolean; | istnieje: boolean; | ||
'''begin''' | '''begin''' | ||
'''if''' W < 0 '''then''' istnieje:=false | |||
'''else''' '''begin''' | |||
p:=1; k:=1; | |||
suma:=A[1]; | |||
'''while''' (suma <> W) '''and''' (k <= N) '''do''' | |||
'''if''' suma < W '''then''' '''begin''' | |||
k:=k+1; | |||
suma:=suma+A[k]; | |||
'''end''' | |||
'''else''' '''begin''' | |||
p:=p+1; | |||
suma:= suma-A[p]; | |||
'''end'''; | |||
istnieje:=(suma=W); | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 490: | Linia 488: | ||
== 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 > 1. Należy sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli | 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. | ||
tak wskazać go. | |||
<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"> | |||
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 class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Linia 500: | Linia 502: | ||
'''var''' i,j,ile,zwyciezca: integer; | '''var''' i,j,ile,zwyciezca: integer; | ||
'''begin''' | '''begin''' | ||
i:=1; | |||
zwyciezca:=0; | |||
'''while''' (i <= (N div 2) + 1) '''and''' (zwyciezca=0)'''do''' '''begin''' | |||
ile:=0; | |||
'''for j:=1 '''to''' N '''do''' if A[i]=A[j] '''then''' ile:=ile+1; | |||
'''if''' (ile > (N+1) div 2) '''then''' zwyciezca:=A[i]; | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
Linia 512: | Linia 514: | ||
<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"> | |||
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ł. | ||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie 2''' | '''Rozwiązanie 2''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Linia 518: | Linia 525: | ||
'''var''' ile,i,a,kand,zwyciezca: integer; | '''var''' ile,i,a,kand,zwyciezca: integer; | ||
'''begin''' | '''begin''' | ||
kand:=1; | |||
a:=A[1]; | |||
ile := 1; | |||
i := 1; | |||
'''while''' i < N '''do''' '''begin''' | |||
i:= i+1; | |||
'''if''' A[i]=a '''then''' ile:=ile+1 | |||
'''else''' | |||
'''if''' ile > 0 '''then''' ile:=ile-1 | |||
'''else''' '''begin''' | |||
a:=T[i]; | |||
ile:=1; | |||
'''end'''; | |||
'''end'''; | |||
ile:=0; | |||
'''for''' i:=1 '''to''' '''do''' | |||
'''if''' A[i]=a '''then''' ile:=ile+1; | |||
'''if''' (ile > (N+1)div 2) '''then''' | |||
zwyciezca:=a | |||
'''else''' | |||
zwyciezca:=0; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 13 (Arytmetyka liczb wielocyfrowych) == | == Zadanie 13 (Arytmetyka liczb wielocyfrowych) == | ||
Linia 550: | Linia 557: | ||
* 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"> | |||
<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"> | ||
'''const''' N=100; | '''const''' N=100; | ||
b=10; | |||
'''type''' liczba = array[0..N-1] of integer; | '''type''' liczba = array[0..N-1] of integer; | ||
dwa_liczba = array[0..2N-1] of integer; | |||
'''procedure''' Suma(A,B:liczba, var C:liczba, var:przepelnienie:boolean); | '''procedure''' Suma(A,B:liczba, var C:liczba, var:przepelnienie:boolean); | ||
'''var''' p: integer; | '''var''' p: integer; | ||
'''begin''' | '''begin''' | ||
p:=0; | |||
'''for''' i:=0 '''to''' N-1 '''do''' '''begin''' | |||
C[i]:=A[i]+B[i]; | |||
'''if''' C[i] >= b '''then''' '''begin''' | |||
C[i]:=C[i]-b; | |||
p:=1; | |||
'''end''' | |||
'''else''' p:=0; | |||
'''end'''; | |||
przepelnienie:=(p=1); | |||
'''end'''; | '''end'''; | ||
'''procedure''' Roznica(A,B:liczba, var C:liczba, var:ujemny:boolean); | '''procedure''' Roznica(A,B:liczba, var C:liczba, var:ujemny:boolean); | ||
'''var''' p: integer; | '''var''' p: integer; | ||
'''begin''' | '''begin''' | ||
p:=0; | |||
'''for''' i:=0 '''to''' N-1 '''do''' '''begin''' | |||
C[i]:=(A[i]-p)-B[i]; | |||
'''if''' C[i] < 0 '''then''' '''begin''' | |||
C[i]:=C[i]+b; | |||
p:=1; | |||
'''end''' | |||
'''else''' p:=0; | |||
'''end'''; | |||
ujemny:=(p=1); | |||
'''end'''; | '''end'''; | ||
'''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba); | '''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba); | ||
'''var''' p,i,j: integer; | '''var''' p,i,j: integer; | ||
'''begin''' | '''begin''' | ||
p:=0; | |||
'''for''' i:=0 '''to''' 2*N-1 '''do''' C[i]:=0; | |||
'''for''' i:=0 '''to''' N-1 '''do''' '''begin''' | |||
'''for''' j:=1 '''to''' N-1 '''do''' '''begin''' | |||
w:=A[i]*B[j]+p+C[i+j]; | |||
C[i+j]:=w '''mod''' b; | |||
p:=w '''div''' b; | |||
'''end'''; | |||
C[i+n]:=p; | |||
p:=0; | |||
'''end'''; | '''end'''; | ||
'''end'''; | '''end'''; | ||
</div> | </div> | ||
</div> | </div> |
Wersja z 12:24, 11 lip 2006
Ta strona zawiera podstawowe zadania na tablice. Ble ble
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.
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 = \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.
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